Получите значение элемента XML, используя произвольный индекс атрибута. - PullRequest
1 голос
/ 02 декабря 2011

Фон

Получить значение из списка элементов XML с использованием уникального идентификатора.

Проблема

С учетом документа XML в виде:

<root xmlns:r="http://internet.com/network">
<r:equipment label="network">
  <r:item id="1">computer</r:item>
  <r:item id="2">network cable</r:item>
</r:equipment>
<r:equipment label="peripheral">
  <r:item id="3">printer</r:item>
  <r:item id="4">USB cable</r:item>
</r:equipment>

<r:install>
  <r:step action="identify"><r:item id="1" />, <r:item id="2" />, <r:item id="3" />, and <r:item id="4" /></r:step>
  <r:step action="unplug"><r:item id="2" /> from <r:item id="1" /></r:step>
  <r:step action="plug"><r:item id="4" /> into <r:item id="3" /></r:step>
  <r:step action="plug"><r:item id="4" /> into <r:item id="1" /></r:step>
</r:install>
</root>

Цель заключается в следующем:

  1. определить компьютер, сетевой кабель, принтер и USB-кабель
  2. отсоединить сетевой кабель от компьютера
  3. штекерUSB-кабель к принтеру
  4. подключите USB-кабель к компьютеру

Я попробовал следующее:

<xsl:template match="r:install">
<p>
Installation
</p>
  <ol>
  <xsl:for-each select="r:step">
    <li><xsl:apply-templates select="." /></li>
  </xsl:for-each>
  </ol>
</xsl:template>

<xsl:template match="//root/r:install/r:step/r:item">
  ID: <xsl:value-of select="@id" />
</xsl:template>

Другими словами, я бы хотел сопоставить <r:install>, а затем используйте атрибут id из любого элемента <r:item ... />.Каждый <r:step /> может иметь несколько ссылок <r:item id="X" />.Эти ссылки соответствуют элементам <r:item>...</r:item> в списке элементов <r:equipment ../>.

Значения id для каждого <r:item /> гарантированно уникальны.

Я бы не хотел использоватьдополнительный тег, если это возможно (например, <r:item-ref id="X" />).

Вопрос

С учетом <r:install><r:step action="unplug"><r:item id="4" /></r:step></r:install> и следующий список:

<r:equipment label="peripheral">
  <r:item id="3">printer</r:item>
  <r:item id="4">USB cable</r:item>
</r:equipment>

Что соответствует selectВыражение XPath для получения значения USB cable при применении шаблона, обращающегося к <r:item id="4" />, который служит ссылкой на указанное значение, где-либо в документе XML?

Спасибо!

1 Ответ

2 голосов
/ 02 декабря 2011

Это идеальная ситуация, чтобы использовать ключ для поиска значений r: item из элементов r: equipment .

<xsl:key name="equipment" match="r:equipment/r:item" use="@id" />

Итак, вы «используете» атрибут @ id для поиска элементов r: equipment / r: item . Чтобы использовать эту клавишу, предполагая, что вы находитесь на одном из ваших элементов r: step / r: item , вы просто делаете это ...

<xsl:value-of select="key('equipment', @id)" />

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:r="http://internet.com/network" exclude-result-prefixes="r">
   <xsl:output method="html" indent="yes"/>

   <xsl:key name="equipment" match="r:equipment/r:item" use="@id" />

   <xsl:template match="/root">
      <xsl:apply-templates select="r:install"/>
   </xsl:template>

   <xsl:template match="r:install">
      <p> Installation </p>
      <ol>
         <xsl:apply-templates select="r:step" />
      </ol>
   </xsl:template>

   <xsl:template match="r:step">
      <li>
         <xsl:value-of select="concat(@action, ' ')" />
         <xsl:apply-templates select="node()" />
      </li>
   </xsl:template>

   <xsl:template match="r:item"> 
      <xsl:value-of select="key('equipment', @id)" />
   </xsl:template>
</xsl:stylesheet>

При применении к вашему исходному XML получается следующее

<p> Installation </p>
<ol>
<li>identify computer, 
            network cable, 
            printer, and 
            USB cable</li>
<li>unplug network cable from 
            computer</li>
<li>plug USB cable into 
            printer</li>
<li>plug USB cable into 
            computer</li>
</ol>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...