在 XSLT 中执行 for-each 无循环



这是我的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>

尝试在样式表中为默认命名空间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>

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

您只显示了样式表的片段 - 因此无法确定您到底在哪里出错了。代码中可能还有其他错误原因。

拆下xsl:for-each零件中tk:HSoThueDTu前面的/

样式表(实际执行某些操作的完整示例)

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

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

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

相关内容

  • 没有找到相关文章

最新更新