2016-06-14 104 views
2

我试图重新排序使用XSLT 1.0的XML元素。以下是XML的小片段XML元素重排序不工作XSLT

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

的问题是,当我改变我会按顺序没有任何变化,但我从

<RIMSDB1 xmlns="http://kiris.nps21.org/xsd"> 

删除的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> 

任何人都可以阐明如果有更好的重新排序方式正在发生的事情。

在此先感谢。

回答

2

当源文档包含xmlns="http://kiris.nps21.org/xsd"时,所有元素(没有名称空间前缀或覆盖的名称空间声明)将继承该名称空间并且绑定到名称空间http://kiris.nps21.org/xsd。当没有命名空间前缀时,有时很难注意或理解。

你应该调整你的XSLT来声明命名空间的前缀,然后调整选配表达式中使用的命名空间前缀,以妥善解决这些元素。

例如:

<?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> 
+0

@ MADS-这为我工作,但我遇到了一些其他的问题。如何在两家母公司和子标签的命名空间处理这个问题,例如 ' \t \t \t \t \t \t \t \t \t \t \t \t 20160610032048 \t \t \t \t \t \t \t \t \t \t \t \t \t 495876043985778649 \t \t \t ' –

+0

在该示例中,元素机智h xmlns =“”被放入“no namespace”中,现在它和它的后代不在文档元素中声明的名称空间中。对于那些在“no namespace”中的用户,在选择/匹配表达式中不要使用名称空间前缀。 –

+0

如果您的输入不是标准的,而且您不确定元素将被绑定到什么时候/哪个名称空间,则可以使用更通用的匹配表达式,该表达式只关心local-name()而不关心名称空间 - URI()。例如* [local-name()='WKYMD'] –