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