2016-06-14 63 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'] –