Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试在xsl中读取xml元素值_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

尝试在xsl中读取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> </

我是新手。我试图使用XSL文件读取XML元素的值。我的XML文件如下所示:

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