这是我的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>
注意:您应该了解有关命名空间和命名空间前缀的更多信息,如果您不了解它们,您将回来询问更多有关它的问题。