2015-04-29 68 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

如果错误的命名空间被更广泛的使用,那么我会使用一个转换管道,其中第一步是对命名空间进行规范化,然后第二步是一个正常的转换与理智的输入一起工作。 –