xslt父元素位置

时间:2010-08-10 19:32:03

标签: xml xslt

我有以下要转换的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>

3 个答案:

答案 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)