2016-09-21 9 views
0

У меня есть входная XML как ..:XSLT, чтобы избежать имен

<?xml version="1.0" encoding="UTF-8"?> 
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
     <S:Body> 
      <ListResponse xmlns="urn:abcde:xyz:1"> 
       <Gtins> 
        <Gtin> 
         <gtinID>11111</gtinID> 
         <name>222222</name> 
         <label>S11111 - EA</label> 
         <description>XYZ</description> 
         <value>11111</value> 
        </Gtin> 
        <Gtin> 
         <gtinID>999999</gtinID> 
         <name>999999</name> 
         <label>asdfg</label> 
         <description>ghgj</description> 
         <value>999999</value> 
        </Gtin> 
       </Gtins> 
      </ListResponse> 
     </S:Body> 
    </S:Envelope> 

Как выбрать каждое значение узла «ГНТП» и избегать имен с помощью XSLT?

Вывод XML должен быть ...

<ns0:RFC xmlns:ns0="http://asd.com"> 
    <Gtins> 
     <Gtin> 
     <gtinID>11111</gtinID> 
     <name>222222</name> 
     <label>S11111 - EA</label> 
     <description>XYZ</description> 
     <value>11111</value> 
     </Gtin> 
     <Gtin> 
     <gtinID>999999</gtinID> 
     <name>999999</name> 
     <label>asdfg</label> 
     <description>ghgj</description> 
     <value>999999</value> 
     </Gtin> 
    </Gtins> 
    </ns0:RFC> 
+1

, пожалуйста, прочитайте [this] (http://stackoverflow.com/help/mcve) и отредактируйте свой вопрос из-за него. – uL1

+0

Пространство имен должно быть ** использовано **, а не * избегать *. См. Здесь, как: http://stackoverflow.com/questions/34758492/xslt-transform-doesnt-work-until-i-remove-root-node/34762628#34762628 –

+0

Спасибо Майкл, но не извлекает значение. Можете ли вы объяснить? – Sdey

ответ

0

Заключение/Резюме комментариев и других уже отвечал на вопросы.

В рекомендации @ michael.hor257k, пожалуйста, посетите эту тему. Принятый ответ на ту же проблему, что и у вас. Use of namespace

Проблема: ваш XML помещает его элементы в пространстве имен.

Объявление те же пространства имен в вашей таблице стилей, присвойте ему префикс и используйте этот префикс для адресации элементов в исходном XML.


Благодаря вашему данному входу, начать и продолжить самостоятельно с этой базой:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:abc="urn:abcde:xyz:1"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/S:Envelope"> 
     <!-- select any child - exemplary --> 
     <xsl:value-of select="S:Body/abc:ListResponse/abc:Gtins/abc:Gtin/abc:gtinID" /> 
    </xsl:template> 

</xsl:stylesheet> 

Кроме того:

Это эквивалентна версия вашего input-xml:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:abc="urn:abcde:xyz:1"> 
    <S:Body> 
     <abc:ListResponse> 
      <abc:Gtins> 
       <abc:Gtin> 
        <abc:gtinID>11111</abc:gtinID> 
        <abc:name>222222</abc:name> 
        <abc:label>S11111 - EA</abc:label> 
        <abc:description>XYZ</abc:description> 
        <abc:value>11111</abc:value> 
       </abc:Gtin> 
       <abc:Gtin> 
        <abc:gtinID>999999</abc:gtinID> 
        <abc:name>999999</abc:name> 
        <abc:label>asdfg</abc:label> 
        <abc:description>ghgj</abc:description> 
        <abc:value>999999</abc:value> 
       </abc:Gtin> 
      </abc:Gtins> 
     </abc:ListResponse> 
    </S:Body> 
</S:Envelope> 

Пространства имён по причинам! Используйте их и не избавляйтесь от них только потому, что «я их не понимаю, поэтому я хочу их удалить». Не поймите меня неправильно, ваш результат-xml МОЖЕТ быть без пространств имен, без сомнения. На SO есть много примеров, идите на это.

1

Попробуйте это в качестве отправной точки:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xyz="urn:abcde:xyz:1" 
exclude-result-prefixes="S xyz"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/S:Envelope"> 
    <ns0:RFC xmlns:ns0="http://asd.com"> 
     <Gtins> 
      <xsl:for-each select="S:Body/xyz:ListResponse/xyz:Gtins/xyz:Gtin"> 
       <Gtin> 
        <gtinID> 
         <xsl:value-of select="xyz:GtinID"/> 
        </gtinID> 
        <!-- more here --> 
       </Gtin> 
      </xsl:for-each>   
     </Gtins> 
    </ns0:RFC> 
</xsl:template> 

</xsl:stylesheet> 

Или еще проще:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xyz="urn:abcde:xyz:1" 
exclude-result-prefixes="S xyz"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/S:Envelope"> 
    <ns0:RFC xmlns:ns0="http://asd.com"> 
     <Gtins> 
      <xsl:apply-templates select="S:Body/xyz:ListResponse/xyz:Gtins/xyz:Gtin"/> 
     </Gtins> 
    </ns0:RFC> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Working Michael ... Спасибо большое! – Sdey

+0

@Sdey Если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ. –

Смежные вопросы