2015-04-29 111 views
1

嗨我有一個XML,每次交付有一個不同的唯一命名命名空間,我不能預先確定標準過程。XSLT-預先定義名稱空間

<ABC xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331" version="1.1"> 
<Extensions> 
    <Identification>urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331</Identification> 
    <Extension> 
    <SrcPackage> 
     <this:ABDList> 
      <TaggedValue>111</TaggedValue> 
     </this:ABDList> 
     <this:SubBegin>0</this:SubBegin> 
    </SrcPackage> 
    <MatPackage> 
     <this:ABDList> 
      <TaggedValue>222</TaggedValue> 
     </this:ABDList> 
     <this:SubBegin>1</this:SubBegin> 
    </MatPackage> 
    <!-- Stuff --> 
    </Extention> 
</Extentions> 
</ABC> 

交付可能是

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1"> 
<Extensions> 
    <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification> 
    <Extension> 
    <SrcPackage> 
     <this:ABDList> 
      <TaggedValue>333</TaggedValue> 
     </this:ABDList> 
     <this:SubBegin>0</this:SubBegin> 
    </SrcPackage> 
    <MatPackage> 
     <this:ABDList> 
      <TaggedValue>444</TaggedValue> 
     </this:ABDList> 
     <this:SubBegin>1</this:SubBegin> 
    </MatPackage> 
    <!-- Stuff --> 
    </Extention> 
</Extentions> 
</ABC> 

我現在的XSL樣式表的下一個XML工程第一個XML預定義的命名空間 但我希望找到一種方法,後來重新定義它。在這個過程中。我已經添加了一個變量來從Identification元素中提取相關的uuid,但不知道如何整合這個。使用下面的樣式表來處理任何其他XML結果的錯誤結果。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331" 
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext"> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" /> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="SelOpGroup" select="/ABC/Extensions/Identification"/> 

<!-- Pass thru ---> 
<xsl:template match="@*|node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 
</xsl:template> 

<xsl:template match="/ABC/Extensions/SrcPackage> 
    <xsl:copy> 
      <this:ABDList> 
       <xsl:copy-of select ="this:ABDList/*"/> 
       <TaggedA>888</TaggedA> 
      </this:ABDList> 
      <this:SubBegin><xsl:value-of select="somethingelse"/> </this:SubBegin> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/ABC/Extensions/MatPackage> 
    <xsl:copy> 
      <this:ABDList> 
       <xsl:copy-of select ="this:ABDList/*"/> 
       <TaggedB>999</TaggedB> 
      </this:ABDList > 
      <this:SubBegin><xsl:value-of select="somethingelse"/> </this:SubBegin> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

預期結果

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1"> 
<Extensions> 
    <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification> 
    <Extension> 
    <SrcPackage> 
     <this:ABDList> 
      <TaggedValue>333</TaggedValue> 
      <TaggedA>888</TaggedA> 
     </this:ABDList> 
     <this:SubBegin>a value</this:SubBegin> 
    </SrcPackage> 
    <MatPackage> 
     <this:ABDList> 
      <TaggedValue>444</TaggedValue> 
      <TaggedB>999</TaggedA> 
     </this:ABDList> 
     <this:SubBegin>a value</this:SubBegin> 
    </MatPackage> 
    <!-- Stuff --> 
    </Extention> 
</Extentions> 
</ABC> 

非常感謝, 阿德里安

+0

你的最後修改是混亂:'的'「somethingelse」在哪裏? –

+0

你現在有了通用的轉換。 –

回答

1

這種轉變

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="SelOpGroup" select="/ABC/Extensions/Identification"/> 

    <!-- Pass thru --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Extension/SrcPackage"> 
    <xsl:copy> 
      <xsl:element name="{'this:ABDList'}" namespace="{$SelOpGroup}"> 
       <xsl:copy-of select="/*/namespace::*[name()='this']"/> 
       <xsl:copy-of select ="*[name() = 'this:ABDList']/*"/> 
       <TaggedA>888</TaggedA> 
      </xsl:element> 
      <xsl:element name="{'this:SubBegin'}" namespace="{$SelOpGroup}"> 
       <xsl:copy-of select="/*/namespace::*[name()='this']"/> 
       <xsl:value-of select="'somethingelse'"/> 
      </xsl:element> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Extension/MatPackage"> 
    <xsl:copy> 
      <xsl:element name="{'this:ABDList'}" namespace="{$SelOpGroup}"> 
       <xsl:copy-of select="/*/namespace::*[name()='this']"/> 
       <xsl:copy-of select ="*[name() = 'this:ABDList']/*"/> 
       <TaggedB>999</TaggedB> 
      </xsl:element> 
      <xsl:element name="{'this:SubBegin'}" namespace="{$SelOpGroup}"> 
       <xsl:copy-of select="/*/namespace::*[name()='this']"/> 
       <xsl:value-of select="'somethingelse'"/> 
      </xsl:element> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

當第一個被提供的XML文檔應用:

<ABC xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331" version="1.1"> 
    <Extensions> 
     <Identification>urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331</Identification> 
     <Extension> 
      <SrcPackage> 
       <this:ABDList> 
        <TaggedValue>111</TaggedValue> 
       </this:ABDList> 
       <this:SubBegin>0</this:SubBegin> 
      </SrcPackage> 
      <MatPackage> 
       <this:ABDList> 
        <TaggedValue>222</TaggedValue> 
       </this:ABDList> 
       <this:SubBegin>1</this:SubBegin> 
      </MatPackage> 
      <!-- Stuff --> 
     </Extension> 
    </Extensions> 
</ABC> 

可生產想要的,正確的結果

<ABC xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331" version="1.1"> 
    <Extensions> 
     <Identification>urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331</Identification> 
     <Extension> 
     <SrcPackage> 
      <this:ABDList> 
       <TaggedValue>111</TaggedValue> 
       <TaggedA>888</TaggedA> 
      </this:ABDList> 
      <this:SubBegin>somethingelse</this:SubBegin> 
     </SrcPackage> 
     <MatPackage> 
      <this:ABDList> 
       <TaggedValue>222</TaggedValue> 
       <TaggedB>999</TaggedB> 
      </this:ABDList> 
      <this:SubBegin>somethingelse</this:SubBegin> 
     </MatPackage><!-- Stuff --> 
     </Extension> 
    </Extensions> 
</ABC> 

當在第二提供的XML文檔被施加相同的變換:

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1"> 
<Extensions> 
    <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification> 
    <Extension> 
    <SrcPackage> 
     <this:ABDList> 
      <TaggedValue>333</TaggedValue> 
     </this:ABDList> 
     <this:SubBegin>0</this:SubBegin> 
    </SrcPackage> 
    <MatPackage> 
     <this:ABDList> 
      <TaggedValue>444</TaggedValue> 
     </this:ABDList> 
     <this:SubBegin>1</this:SubBegin> 
    </MatPackage> 
    <!-- Stuff --> 
    </Extension> 
</Extensions> 
</ABC> 

同樣有用,正確的結果產生

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1"> 
    <Extensions> 
     <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification> 
     <Extension> 
     <SrcPackage> 
      <this:ABDList> 
       <TaggedValue>333</TaggedValue> 
       <TaggedA>888</TaggedA> 
      </this:ABDList> 
      <this:SubBegin>somethingelse</this:SubBegin> 
     </SrcPackage> 
     <MatPackage> 
      <this:ABDList> 
       <TaggedValue>444</TaggedValue> 
       <TaggedB>999</TaggedB> 
      </this:ABDList> 
      <this:SubBegin>somethingelse</this:SubBegin> 
     </MatPackage><!-- Stuff --> 
     </Extension> 
    </Extensions> 
</ABC> 
+0

謝謝Dimitre。一如既往的驚人結果! – user1540142

+0

@ user1540142,不客氣。 –

0

我有一個在每個交付都有不同的獨特的命名 命名空間提前

有人的XML你obvi很難理解擁有命名空間的目的。

這也許能爲你的不幸情況下工作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="SrcPackage/*/TaggedValue"> 
    <xsl:copy-of select="."/> 
    <TaggedA>888</TaggedA> 
</xsl:template> 

<xsl:template match="MatPackage/*/TaggedValue"> 
    <xsl:copy-of select="."/> 
    <TaggedB>999</TaggedB> 
</xsl:template> 

</xsl:stylesheet> 
+0

謝謝邁克爾,是一個頗受好評的公司,對我來說並不容易。我喜歡你的迴應,但我會更新這個問題,因爲我需要一種重新定義名稱空間的方式,因爲我還必須分析使用this:element名稱約定的元素。 – user1540142

1

這是奇怪的輸入(那他們吸菸?)。但是由於名稱空間僅用於一個元素ABDList,我的方法是使用XSLT 2.0中的*:ABDList或XSLT 1.0中的*[local-name()='ABDList']來選擇ABDList元素。

+0

感謝Michael,Ive更新了這個問題,以顯示更多的複雜性和要求找到一種方式來重新定義命名空間。 – user1540142

+0

好的命名空間建議與兩個版本,再加上一個。 –

+0

如果錯誤的命名空間被更廣泛的使用,那麼我會使用一個轉換管道,其中第一步是對命名空間進行規範化,然後第二步是一個正常的轉換與理智的輸入一起工作。 –