我正在尝试使用XSLT 1.0重新排序XML中的元素。下面是XML的小片段
<RIMSDB1 xmlns="http://kiris.nps21.org/xsd">
<ROW>
<ReportID>1</ReportID>
<WKYMD>20160610</WKYMD>
<RunSystemDate>20160610032048</RunSystemDate>
</ROW>
<ROW>
<ReportID>2</ReportID>
<WKYMD>27869</WKYMD>
<RunSystemDate>495876043985778649</RunSystemDate>
</ROW>
这是我用来转换它的XSLT。
<xsl:template match="*/ROW">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="WKYMD" />
<xsl:apply-templates select="RunSystemDate" />
<xsl:apply-templates select="ReportID" />
</xsl:copy>
问题是当我转换时我没有按顺序改变但是我删除了xmlns =&#34; http://kiris.nps21.org/xsd"来自
<RIMSDB1 xmlns="http://kiris.nps21.org/xsd">
我得到了正确的转换,即:
<RIMSDB1>
<ROW>
<WKYMD>20160610</WKYMD>
<RunSystemDate>20160610032048</RunSystemDate>
<ReportID>1</ReportID>
</ROW>
<ROW>
<WKYMD>27869</WKYMD>
<RunSystemDate>495876043985778649</RunSystemDate>
<ReportID>2</ReportID>
</ROW>
如果有更好的重新排序方法,任何人都可以了解正在发生的事情。
提前致谢。
答案 0 :(得分:2)
当源文档包含xmlns="http://kiris.nps21.org/xsd"
时,所有元素(没有名称空间前缀或覆盖名称空间声明)将继承该名称空间并绑定到名称空间http://kiris.nps21.org/xsd
。当没有名称空间前缀时,有时很难注意到或理解。
您应该调整XSLT以使用前缀声明该命名空间,然后调整select和match表达式以使用命名空间前缀以正确地处理这些元素。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:k="http://kiris.nps21.org/xsd"
version="1.0">
<xsl:template match="*/k:ROW">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="k:WKYMD" />
<xsl:apply-templates select="k:RunSystemDate" />
<xsl:apply-templates select="k:ReportID" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>