背景
使用唯一标识符从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>
目标是生产以下产品:
- 识别计算机、网络电缆、打印机和USB电缆
- 从计算机上拔下网络电缆
- 将USB电缆插入打印机
- 将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>
上进行匹配,然后使用任何<r:item ... />
元素的id
属性。每个<r:step />
可以具有多个<r:item id="X" />
引用。这些引用对应于<r:equipment ../>
元素列表中的<r:item>...</r:item>
元素。
保证每个<r:item />
的id
值是唯一的。
如果可能的话,我希望避免使用额外的标签(例如<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>
当在XML文档中的任何位置应用一个命中<r:item id="4" />
的模板(用作对所述值的引用(时,要获得USB cable
的值,对应的select
XPath表达式是什么?
谢谢!
这是使用键从r:equipment元素中查找r:item值的理想情况。
<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>