Как обрабатывать разные узлы в xslt - PullRequest
0 голосов
/ 05 октября 2018

У меня есть это:

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

    <ns0:envelope xmlns:ns0="http://xxx/xxx/envelope/1.0">
    <ns0:header>
    </ns0:header>
    <ns0:body>
        <ns1:sales xmlns:ns1="http://xxx/xxx/sales/1.0/" standardversion="1.1" guid="0">
            <ns1:itemMeta>
                <ns1:provider/>
                <ns1:documentModified>2018-10-05T11:41:09.344+02:00</ns1:documentModified>
                <ns1:documentVersion>1</ns1:documentVersion>
                <ns1:documentType>XML</ns1:documentType>
            </ns1:itemMeta>
            <ns1:contentSet>
                <ns1:inlineXML>
                    <group>
                        <ns2:ptv>
                            <ns2:id type="xxx">15566</ns2:id>
                            <ns2:info>
                                <ns2:type>xxx</ns2:type>
                                <ns2:name>xxx</ns2:name>
                        </ns2:ptv>
                        <ns2:ptv>
                            <ns2:id type="xxx">13444</ns2:id>
                            <ns2:info>
                                <ns2:type>yyy</ns2:type>
                                <ns2:name>yyy</ns2:name>
                        </ns2:ptv>
                        <ns2:ptv>
                            <ns2:id type="xxx">155525</ns2:id>
                            <ns2:info>
                                <ns2:type>xxx</ns2:type>
                                <ns2:name>xxx</ns2:name>
                        </ns2:ptv>
                    </group>
                </ns1:inlineXML>
            </ns1:contentSet>
        </ns1:salesItem>
    </ns0:body>
</ns0:envelope>

Как я могу прочитать каждую строку "ptv" отдельно в xslt?

Мой xsl выглядит примерно так:

<xsl:template match="/">
        <xsl:element name="ptv">
            <xsl:attribute name="mode">
                <xsl:value-of select="/body/salesItem/contentSet/inlineXML/group/ptv/@mode"></xsl:value-of>
            </xsl:attribute>
            <xsl:attribute name="timestamp">
                <xsl:value-of select="/body/salesItem/contentSet/inlineXML/group/ptv/@timestamp"></xsl:value-of>
            </xsl:attribute>
            <xsl:apply-templates select="/body/salesItem/contentSet/inlineXML/group/ptv/*" mode="content" />
        </xsl:element>
    </xsl:template>

Как сделать, чтобы все объекты "ptv" обрабатывались отдельно?(как foreach ..)

В настоящее время результатом является один тег "ptv" и все данные "x" ptv внутри ...

thx

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

<?xml version="1.0" encoding="utf-8"?>


<ptv>
  <id type="xxx">15566</id>
<info> 
<type>xxx</type> 
<name>xxxx</name>
</info>
</ptv>

<ptv> 
<id type="xxx">15566</id>
<info> 
<type>xxx</type>
<name>xxxx</name>
</info>
</ptv> 

<ptv> 
<id type="xxx">15566</id>
<info> 
<type>xxx</type> 
<name>xxxx</name>
</info>
</ptv>

1 Ответ

0 голосов
/ 05 октября 2018

Если вы хотите обрабатывать несколько элементов, например, ptv, просто выберите их с помощью xsl:for-each или, что еще лучше, с шаблоном ...

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://xxx/xxx/envelope/1.0"
    xmlns:ns1="http://xxx/xxx/sales/1.0/"
    xmlns:ns2="http://xxx/xxx/ptv/1.0/"
    exclude-result-prefixes="ns0 ns1 ns2"
    version="1.0">

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

  <xsl:strip-space elements="*" />

  <xsl:template match="/">
    <xsl:apply-templates select="/ns0:envelope/ns0:body/ns1:salesItem/ns1:contentSet/ns1:inlineXML/group/ns2:ptv" />
  </xsl:template>

  <xsl:template match="ns2:ptv">
    <ptv mode="{@mode}">
      <xsl:apply-templates mode="content"/>
    </ptv>
  </xsl:template>

  <xsl:template match="*" mode="content">
    <xsl:element name="{local-name()}">
      <xsl:copy select="@*" />
      <xsl:apply-templates mode="content" />
    </xsl:element>
  </xsl:template>  
</xsl:stylesheet>

Обратите внимание, что в вашем XML отсутствует объявление пространства имен для ns2, поэтому я что-то придумал.Также обратите внимание, как XSLT должен обрабатывать пространства имен в вашем XML.

...