如何在xslt

时间:2018-10-05 11:47:18

标签: xml xslt xslt-1.0 xslt-2.0

我有这个:

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

如何在xslt中分别读取每个“ ptv”行?

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

edit:这就是我需要的结果。请让我知道我该怎么做。

<?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 :(得分:1)

如果您想处理多个元素,例如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中的名称空间。