试图读取xsl中的xml元素值

时间:2013-04-15 16:00:00

标签: xml xslt xslt-1.0

我是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" />

但没有运气。请帮忙!

2 个答案:

答案 0 :(得分:3)

您的??????????????????可以是<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的一小部分非常常见且非常强大,你应该learn how to use it

答案 1 :(得分:0)

好吧,如果你真的想得到一个名字保存在一个变量中的元素的值,你可以这样做吗

<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>