2015-04-29 2 views
1

Привет, У меня есть XML, который при каждой поставке имеет уникальное именованное пространство имен, которое я не могу предварительно определить стандартными процессами.XSLT- Pre Define NameSpace

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

Следующая 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 --> 
    </Extention> 
</Extentions> 
</ABC> 

Мой текущий XSL стилей работает на первом XML предопределен в пространство имен Но я ищу, чтобы найти способ заново определить его позже. о процессе. Я добавил переменную, чтобы вытащить соответствующий uuid из элемента Identification, но я не уверен, как его интегрировать. Использование приведенной ниже таблицы стилей для обработки любых других 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

Ваша последняя модификация запутанным: ' 'Где« что-то »? –

+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

Спасибо Димитр. Удивительный результат, как всегда! – user1540142

+0

@ user1540142, добро пожаловать. –

0

У меня есть XML, что при каждой поставке имеет другую уникальную по имени пространство имен

Кто-то впереди вас обви ously не понимает цели создания пространства имен.

Возможно, это могло бы работать в вашей неудачной ситуации:

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

Спасибо, Майкл, Да, довольно уважаемая компания не облегчает мне жизнь.Мне нравится ваш ответ, но я обновлю вопрос, поскольку мне нужен способ переопределить пространство имен, поскольку я должен также анализировать элементы, которые используют соглашение: name. – user1540142

1

Это странно вход (что они были курить?). Но поскольку пространство имен используется только для одного элемента, ABDList, моим подходом было бы выбрать элементы ABDList с использованием *:ABDList в XSLT 2.0 или *[local-name()='ABDList'] в XSLT 1.0.

+0

спасибо Майкл, Ive обновил вопрос, чтобы показать больше сложности и требование найти способ каким-то образом определить пространство имен. – user1540142

+0

Хорошие предложения пространства имен с обеих версий, плюс один. –

+0

Если пространство имен ошибочных имен более широко используется, я бы использовал конвейер преобразования, в котором первый шаг нормализует пространства имен и ничего не делает; второй шаг - это нормальное преобразование, работающее со звуковым входом. –