尝试在xsl中读取xml元素值
我是新手。我试图使用XSL文件读取XML元素的值。我的XML文件如下所示:尝试在xsl中读取xml元素值,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我是新手。我试图使用XSL文件读取XML元素的值。我的XML文件如下所示: <PersonList> <Person> <Name>person1</Name> <Age>21</Age> </Person> <Person> <Name>person2</Name> <Age>21</Age> </
<PersonList>
<Person>
<Name>person1</Name>
<Age>21</Age>
</Person>
<Person>
<Name>person2</Name>
<Age>21</Age>
</Person>
</PersonList>
<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>
但是没有运气。请帮忙 如果你真的想得到一个元素的值,而这个元素的名称保存在一个变量中,在你的例子中,你可以这样做
<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>
您的
?????
可以是
(即上下文元素的字符串值)。它与$elementName
没有连接
您可以更简洁地这样做:
<xsl:for-each select="*">
<xsl:variable name="elementName" select="name()"/>
<xsl:variable name="elementValue" select="string(.)"/>
</xsl:for-each>
复制几乎所有内容并只更改一点点xml的这种模式非常常见且功能强大。请考虑发布您希望使用XSLT为发布的xml输入示例创建的xml结果。很难从XSLT示例中看出您想要实现什么,因为它存在语法错误,如
xsl模板
,以及逻辑缺陷,如每个正文都是空的,或者使用name(.)
,其中上下文节点是根节点。我已经更正了xsl。请考虑一下。我想在一个循环中得到elementValue变量中的Person1,21,Person2,21的值。你应该仔细阅读拉处理(你正在做的)和推方式之间的区别。对于这样的任务,使用模板和应用模板的push样式更加自然,并且与XSL处理器的工作方式相匹配。看起来您只是在尝试将输入复制到输出。。。在谷歌上搜索“XSL标识模板”。谢谢你的回答。这不是完整的xsl。实际上,我需要根据元素中的值修改xml。您是否考虑过对每个
循环使用模板而不是嵌套的?我是xsl新手。不太了解如何使用模板。
<xsl:for-each select="*">
<xsl:variable name="elementName" select="name()"/>
<xsl:variable name="elementValue" select="string(.)"/>
</xsl: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>