Как связать два элемента вместе, если они имеют одинаковое имя в xslt? - PullRequest
1 голос
/ 01 февраля 2012

У меня есть эти деревья, одно с этой структурой / автомобили / машина, а второе / производитель / автомобили / машина. Первый имеет ссылку на идентификатор второго списка автомобилей.

<xsl:template match="t:cars/t:car">
<tr>
    <td>
        <xsl:if test="position()=1">
            <b><xsl:value-of select="../@name"/><xsl:text> </xsl:text></b>
        </xsl:if>


    </td>
</tr>

У меня есть это, оно было заполнено циклом for, через некоторое время я узнал, что я не смог этого сделать.

Это то, что было раньше:

<xsl:template match="t:cars/t:car">
<tr>
    <td>
        <xsl:if test="position()=1">
            <b><xsl:value-of select="../@name"/><xsl:text> </xsl:text></b>
        </xsl:if>
        <xsl:for-each select="/t:root/t:maker/t:car">
            <xsl:if test="t:root/t:maker/@id = @ref">
                <xsl:value-of select="@title"/>
            </xsl:if>
        </xsl:for-each>

    </td>
</tr>

образец:

auto>
<maker type="toyota">
    <car name="prius" id="1"/>
</maker>

<cars name="My Collection">
    <car ref="1" />
</cars>

1 Ответ

1 голос
/ 01 февраля 2012

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

<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:key name="kCarById" match="maker/car" use="@id"/>

 <xsl:template match="/*">
  <table>
   <xsl:apply-templates/>
  </table>
 </xsl:template>

 <xsl:template match="cars/car">
    <tr>
        <td>
          <b>
           <xsl:value-of select="key('kCarById', @ref)/@name"/>
           </b>
        </td>
    </tr>
 </xsl:template>
</xsl:stylesheet>

применительно к этому XML-документу (предоставленное, только что немного расширенное):

<auto>
    <maker type="toyota">
        <car name="prius" id="1"/>
    </maker>
    <maker type="honda">
        <car name="accord" id="2"/>
    </maker>
    <maker type="benz">
        <car name="mercedes" id="3"/>
    </maker>

    <cars name="My Collection">
        <car ref="2" />
        <car ref="3" />
    </cars>
</auto>

дает требуемый, правильный результат :

<table>
   <tr>
      <td>
         <b>accord</b>
      </td>
   </tr>
   <tr>
      <td>
         <b>mercedes</b>
      </td>
   </tr>
</table>

Пояснение : правильное использование клавиш .

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