xslt позиция родительского элемента - PullRequest
2 голосов
/ 10 августа 2010

У меня есть следующий 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 ]

1 голос
/ 11 августа 2010

Это преобразование:

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

Примечание : Использование модифицированного правила идентификации с параметром, который передает текущую позицию водителя.Это значительно эффективнее, чем подсчет предыдущих братьев и сестер.

0 голосов
/ 11 августа 2010

0 голосов
/ 11 августа 2010

Эта таблица стилей:

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

Примечание : счет предшествует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...