我有以下要转换的xml。但我不知道如何在转换后的xml中获取主驱动程序标记值。主驱动程序应该基于驱动程序节点的位置。有人可以帮帮我吗?
<drivers>
<driver>
<first_name>Doug</first_name>
<last_name>Harry</last_name>
<vehicles>
<vehicle>
<vin>4T1BB46K08</vin>
<year>2008</year>
</vehicle>
</vehicles>
<records/>
</driver>
<driver>
<first_name>Sherry</first_name>
<last_name>Bloom</last_name>
<vehicles>
<vehicle>
<vin>5TDZA23C06</vin>
<year>2006</year>
</vehicle>
</vehicles>
<records/>
</driver>
</drivers>
结果应为
<Vehicles>
<vehicle>
<vin>4T1BB46K08</vin>
<year>2008</year>
<primarydriver>1</primarydriver>
</vehicle>
<vehicle>
<vin>5TDZA23C06</vin>
<year>2006</year>
<primarydriver>2</primarydriver>
</vehicle>
</Vehicles>
答案 0 :(得分:1)
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:param name="pDriverPos"/>
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<Vehicles>
<xsl:apply-templates/>
</Vehicles>
</xsl:template>
<xsl:template match="driver">
<xsl:apply-templates>
<xsl:with-param name="pDriverPos" select="position()"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="vehicles">
<xsl:param name="pDriverPos"/>
<xsl:apply-templates>
<xsl:with-param name="pDriverPos" select="$pDriverPos"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="vehicle">
<xsl:param name="pDriverPos"/>
<vehicle>
<xsl:apply-templates/>
<primarydriver><xsl:value-of select="$pDriverPos"/></primarydriver>
</vehicle>
</xsl:template>
<xsl:template match="first_name|last_name|records"/>
</xsl:stylesheet>
应用于提供的XML文档时:
<drivers>
<driver>
<first_name>Doug</first_name>
<last_name>Harry</last_name>
<vehicles>
<vehicle>
<vin>4T1BB46K08</vin>
<year>2008</year>
</vehicle>
</vehicles>
<records/>
</driver>
<driver>
<first_name>Sherry</first_name>
<last_name>Bloom</last_name>
<vehicles>
<vehicle>
<vin>5TDZA23C06</vin>
<year>2006</year>
</vehicle>
</vehicles>
<records/>
</driver>
</drivers>
生成想要的正确结果:
<Vehicles>
<vehicle>
<vin>4T1BB46K08</vin>
<year>2008</year>
<primarydriver>1</primarydriver>
</vehicle>
<vehicle>
<vin>5TDZA23C06</vin>
<year>2006</year>
<primarydriver>2</primarydriver>
</vehicle>
</Vehicles>
请注意:使用带有传递当前驱动程序位置的参数的修改后的身份规则。这比计算前一个兄弟姐妹的效率要高得多。
答案 1 :(得分:0)
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="drivers">
<Vehicles>
<xsl:apply-templates/>
</Vehicles>
</xsl:template>
<xsl:template match="driver|driver/*|driver/*/text()">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="vehicle/*[last()]">
<xsl:call-template name="identity"/>
<primarydriver>
<xsl:value-of select="count(preceding::driver)+1"/>
</primarydriver>
</xsl:template>
</xsl:stylesheet>
输出:
<Vehicles>
<vehicle>
<vin>4T1BB46K08</vin>
<year>2008</year>
<primarydriver>1</primarydriver>
</vehicle>
<vehicle>
<vin>5TDZA23C06</vin>
<year>2006</year>
<primarydriver>2</primarydriver>
</vehicle>
</Vehicles>
注意:计算在前。
答案 2 :(得分:0)