试图在xsl中读取xml元素值



我是XSL的新手。我正在尝试使用XSL文件读取XML元素的值。我的XML文件如下:

<PersonList>
  <Person>
    <Name>person1</Name>
    <Age>21</Age>
  </Person>
  <Person>
    <Name>person2</Name>
    <Age>21</Age>
  </Person>
</PersonList>

我的XSL文件是这样的:

<xsl:stylesheet version="1.0" xmlns=...>
  <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml declaration="no" />
  <xsl template match="/">
    <PersonList>
      <xsl:for-each select="PersonList/Person">
        <Person>
          <xsl:for-each select="*">
            <xsl:variable name="elementName">
              <xsl:value-of select="name(.)" />
            </xsl:variable>
            <xsl:variable name="elementValue">
              ???
            </xsl:variable>
          </xsl:for-each>
        </Person>
      </xsl:for-each>
    </PersonList> 
  </xsl:template>
</xsl:stylesheet>

我应该如何替换???以获得存储在elementName变量中的元素的值。我分别尝试了以下三行:

<xsl:value-of select="value(.)" /> 
<xsl:value-of select="value($elementName)" />
<xsl:value-of select="$elementName" />

但运气不好。请帮助!

您的??????????????????可以是<xsl:value-of select="."/>(即上下文元素的字符串值)。没有连接到$elementName .

你可以更简洁地这样做:

<xsl:for-each select="*">
  <xsl:variable name="elementName" select="name()"/>
  <xsl:variable name="elementValue" select="string(.)"/>
</xsl:for-each>

但是你的模板真的很奇怪。您收集了这些变量,但没有对它们做任何操作——它们不会出现在输出中。您想要得到什么样的输出?

使用for-each通常是一种代码气味。在几乎所有情况下,您最好使用多个模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="Person/*">
    <xsl:variable name="elementName" select="name()"/>
    <xsl:variable name="elementValue" select="string(.)"/>
</xsl:template>
</xsl:stylesheet>

这种模式,你复制几乎所有的东西,只改变一点点的xml是非常常见和非常强大的,你应该学习如何使用它。

如果你真的想要获取一个名称保存在变量中的元素的值,在你的例子中你可以这样做

<xsl:variable name="elementValue">
    <xsl:value-of select="../*[name()=$elementName]" />
</xsl:variable>

但是,这是非常复杂的事情。您处于xsl:for-each循环中,遍历Person的子元素。因此,由于您已经定位在需要值的元素上,因此可以这样做,而不用考虑elementName变量。

<xsl:variable name="elementValue">
    <xsl:value-of select="."/>
</xsl:variable>

实际上,你可以把循环简化成这个

<xsl:for-each select="PersonList/Person">
   <Person>
      <xsl:for-each select="*">
         <xsl:value-of select="." />
      </xsl:for-each>
   </Person>
</xsl:for-each>

相关内容

  • 没有找到相关文章

最新更新