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