使用XSL循环遍历XML文档中的后代节点

时间:2017-03-23 01:41:00

标签: xml xslt xpath

我正在尝试遍历XML文档中的后代节点,但我似乎无法获得正确的语法。 XML文件附带一个命名空间,因此在我的XSL文档中,我将该命名空间别名化。我的XML文档的简单版本如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="my.xsl"?>
<game id="4496878f-921c-41ab-9fcd-54906a9ed89c" status="closed">
  <summary>
    <quarter id="1" points="10"/>
    <quarter id="2" points="3"/>
    <quarter id="3" points="0"/>
    <quarter id="4" points="6"/>
  </summary>
</game>

我的XSL文档如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="my.xsl">
<xsl:output method="text" indent="no" />

<xsl:template match="/">
      <xsl:text>QUARTER,POINTS</xsl:text>
      <xsl:apply-templates select="/f:game/f:summary" />
</xsl:template>

<xsl:template match="f:summary">
      <xsl:text>&#13;</xsl:text>
        <xsl:for-each select"/f:quarter">
               <xsl:text>"</xsl:text><xsl:value-of select="@id"/><xsl:text>"</xsl:text>
               <xsl:text>,"</xsl:text><xsl:value-of select="@points"/><xsl:text>"</xsl:text>
        </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

    Xml add Namespace

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Untitled4.xsl"?>
<game id="4496878f-921c-41ab-9fcd-54906a9ed89c" status="closed"  xmlns="http://www.test.com/">
<summary>
<quarter id="1" points="10"/>
<quarter id="2" points="3"/>
<quarter id="3" points="0"/>
<quarter id="4" points="6"/>
</summary>
</game>

和xsl文件添加namesapce

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://www.test.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslFormatting="urn:xslFormatting">
<xsl:output method="text" indent="no" />
<xsl:template match="/">
<xsl:text>QUARTER,POINTS</xsl:text>
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="t:summary">
<xsl:text>&#13;</xsl:text>
<xsl:for-each select="t:quarter">
<xsl:text>\"</xsl:text><xsl:value-of select="@id"/><xsl:text>\"</xsl:text>
<xsl:text>,\"</xsl:text><xsl:value-of select="@points"/><xsl:text>\"</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

  

XML文件带有命名空间

我在提供的XML示例中没有看到命名空间。正如其他人所指出的,如果您有命名空间,则必须将前缀绑定到输入中使用的相同命名空间URI。

此外,<xsl:for-each select"/f:quarter">正在尝试选择一个名为quarter根元素,它不存在。更不用说缺少=

你可能意味着<xsl:for-each select=".//f:quarter">,但是你不需要它来选择当前的孩子(而不是后代)节点 - 只需<xsl:for-each select="f:quarter">