我有这个:
<?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>
答案 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中的名称空间。