在XSLT中执行for-each没有循环

时间:2014-02-25 09:43:17

标签: xml xslt xslt-1.0

这是我的XML输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<HSoThueDTu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://kekhaithue.gdt.gov.vn/TKhaiThue">
  <HSoKhaiThue>
    <TTinChung>
      <TTinDVu>
        <maDVu>01</maDVu>
        <tenDVu>Number 01</tenDVu>
      </TTinDVu>
      <TTinDVu>
        <maDVu>02</maDVu>
        <tenDVu>Number 02</tenDVu>
      </TTinDVu>
      <TTinDVu>
        <maDVu>03</maDVu>
        <tenDVu>Number 03</tenDVu>
      </TTinDVu>
    </TTinChung>
  </HSoKhaiThue>
</HSoThueDTu>

我正在尝试使用XSL转换将内容打印到HTML。但是我在使用for-each时遇到了困难

<xsl:for-each select="//*[local-name()='TTinDVu']">

但它没有循环。 我尝试了另一种方式:      它有同样的问题

我的xslt如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:decimal-format name="viVNFormat" decimal-separator="," grouping-separator="."/>
    <xsl:template match="/">
        ...
        <xsl:for-each select="/HSoThueDTu/HSoKhaiThue/TTinChung">
           ...
        </xsl:for-each>
        ...
    </xsl:template>
</xsl:stylesheet>

3 个答案:

答案 0 :(得分:1)

尝试在样式表中设置默认命名空间http://kekhaithue.gdt.gov.vn/TKhaiThue的快捷方式,例如xmlns:kek="http://kekhaithue.gdt.gov.vn/TKhaiThue"

然后,请参考应用前缀kek:的节点,例如

<xsl:for-each select="/kek:HSoThueDTu/kek:HSoKhaiThue/kek:TTinChung">

总结一下,应该使用以下样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kek="http://kekhaithue.gdt.gov.vn/TKhaiThue">
    <xsl:output method="xml"/>
    <xsl:decimal-format name="viVNFormat" decimal-separator="," grouping-separator="."/>

    <xsl:template match="/">
        <xsl:for-each select="kek:HSoThueDTu/kek:HSoKhaiThue/kek:TTinChung/kek:TTinDVu">
            <xsl:copy>
            <!-- do something here -->
            </xsl:copy>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

您的XML具有默认命名空间xmlns="http://kekhaithue.gdt.gov.vn/TKhaiThue"。这意味着源XML中所有未加前缀的节点都属于该命名空间。您还应该在XSLT中使用前缀声明命名空间。像这样:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mypref="http://kekhaithue.gdt.gov.vn/TKhaiThue">
    <xsl:output method="xml"/>
    <xsl:decimal-format name="viVNFormat" decimal-separator="," grouping-separator="."/>
    <xsl:template match="/">
        ...
        <xsl:for-each select="mypref:HSoThueDTu/mypref:HSoKhaiThue/mypref:TTinChung/mypref:TTinDVu">
           ...
        </xsl:for-each>
        ...
    </xsl:template>
</xsl:stylesheet>

注意:您应该了解有关命名空间和命名空间前缀的更多信息,如果您不理解它们,您会回来询问有关它的更多问题。

答案 2 :(得分:0)

您的输入XML具有默认命名空间。这也需要在您的XSLT样式表中声明 - 如果您引用输入元素,则必须前缀它们。

您只显示了样式表的一小部分 - 因此无法确定出错的位置。您的代码中可能存在其他错误原因。

删除/部分tk:HSoThueDTu前面的xsl:for-each

样式表(实际上某事的完整示例)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tk="http://kekhaithue.gdt.gov.vn/TKhaiThue">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:decimal-format name="viVNFormat" decimal-separator="," grouping-separator="."/>
    <xsl:template match="/">
        <xsl:for-each select="tk:HSoThueDTu/tk:HSoKhaiThue/tk:TTinChung">
           <xsl:text>Found </xsl:text>
           <xsl:value-of select="count(tk:TTinDVu)"/>
           <xsl:text> TTinDVu elements!</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

<强>输出

Found 3 TTinDVu elements!