我是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" />
但没有运气。请帮忙!
答案 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>