2016-06-12 134 views
0

我是XSLT的新手。我一直在試圖轉換XML很長一段時間,但無法做到。 的輸入XML是這樣的:如果它的值是version 2使用xslt替換xml中屬性值中的字符串1.0

<Load v:MajorVersion="05" v:MinorVersion="01" xmlns="version 2" xmlns:v="version 2"> 
    <annotation/> 
    <Header></Header> 
    <Body></Body> 
</Load> 

輸出應該替換屬性xmlnsversion 2值和xmlns:vversion 1,否則應保持原樣。
問題是這些屬性很容易發生變化,輸入xml可能類似於xmlns:nxmlns:m,或者這些屬性可能不存在。

最後,我們應該尋找節點Load的所有屬性,並在所有的屬性搜索字符串version 2(喜歡的xmlns,XMLNS:V,XMLNS:N等) 和version 1更換。

請幫幫我。相信我我花了數小時爲此尋找答案。

回答

0

您的屬性是名稱空間聲明。因此,請查看「如何更改命名空間的URL」。

您可以嘗試這樣的事:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:v2="version 2"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()"/> 
      </xsl:copy> 
    </xsl:template> 

    <xsl:template match="v2:*"> 
     <xsl:element name="{local-name()}" xmlns="version 1"> 
       <xsl:apply-templates select="node()|@*"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@v2:*"> 
    <xsl:attribute name="{local-name()}" xmlns="version 1"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet 
+0

謝謝,我已經看到了上述解決方案。問題是,命名空間限定符是動態的,它可能會以v2或pidx的形式出現,甚至會出現其他情況。也可以有多個名稱空間聲明,其值爲「版本2」。目的是替換所有名稱空間聲明,從「版本2」到「版本1」 –

+0

您正在討論命名空間uri相同的命名空間前綴。他們不重要。你只需要在你的xslt中有一個獨特的前綴,它不需要和xml中的相同。試試上面的模板。 –

0

你需要考慮在XPath數據模型的方面,而不是在源XML的條款。如果您瞭解XML片段的數據模型,您將會明白,您不希望更改xmlns屬性的值,您想要更改元素和屬性名稱的命名空間部分;也就是說,您希望創建名稱與舊元素/屬性具有相同本地名稱但具有不同名稱空間URI的新元素/屬性。所以你想要的指令,如

<xsl:element name="name()" namespace="...."/> 
<xsl:attribute name="v:majorVersion" namespace="...."/>