如何分离 idrefs 并显示其父元素的属性值?
How to separate idrefs and show their parent element's attribute value?
假设我有一个用 dtd 声明的 XML 文件,例如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE box SYSTEM "box.dtd">
<box>
<title>My Powerful BOX</title>
<tape_list>
<tape tid="tr_1" name="tp_2000"/>
<tape tid="tr_2" name="tp_20230"/>
<tape tid="tr_3" name="tp_200412"/>
<tape tid="tr_4" name="tp_202530341"/>
<tape tid="tr_5" name="tp_20320"/>
<tape tid="tr_6" name="tp_202340"/>
<tape tid="tr_7" name="tp_20253"/>
<tape tid="tr_8" name="tp_202613"/>
<tape tid="tr_9" name="tp_20234"/>
<tape tid="tr_10" name="tp_234000"/>
<tape tid="tr_11" name="tp_202500"/>
<tape tid="tr_12" name="tp_201200"/>
</tape_list>
<item_list>
<item item_id="No_1">
<item_info item_name="MY_item_NAME"/>
<tapes ref_id="tr_10 tr_11 tr_4"/>
</item>
<item item_id="No_2">
<item_info item_name="MY_item_NAME2"/>
<tapes ref_id="tr_2"/>
</item>
</item_list>
</box>
我正在制作一个 xsl 来显示来自 item_list 的 table 个项目。我想显示来自 tape_list/tape/@name 的 item_list/item/tapes 名称,但请记住 ref_id 类型是 IDREF,tid 是唯一 ID。类似的东西:
<--Outside of xsl:template-->
<xsl:key name="tape" match="tape_list/tape" use="@tid"/>
<--------------------------->
<table border="1">
<xsl:for-each select="box/item_list/item">
<tr bgcolor="#9acd32">
<th>title</th>
<th>used tapes</th>
</tr>
<tr>
<td>
<xsl:value-of select="./item_info/@item_name"/>
</td>
<td>
<xsl:for-each select="key('tape', tapes/@ref_id)">
<xsl:value-of select="@name"/>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
但是此 returns 信息仅适用于项目 NO_2,returns 与 NO_1 无关。我的问题是为什么会发生这种情况以及如何显示相应 ID 的名称?
P.S: 我正在使用 xsl 版本 2.0
您没有post预期的结果。我猜你想做这样的事情:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="tape" match="tape_list/tape" use="@tid"/>
<xsl:template match="/box">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>title</th>
<th>used tapes</th>
</tr>
<xsl:for-each select="item_list/item">
<tr>
<td>
<xsl:value-of select="item_info/@item_name"/>
</td>
<td>
<xsl:value-of select="key('tape', tokenize(tapes/@ref_id, ' '))/@name" separator=", "/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
根据您的输入,这将产生:
结果
<!DOCTYPE HTML><html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>title</th>
<th>used tapes</th>
</tr>
<tr>
<td>MY_item_NAME</td>
<td>tp_202530341, tp_234000, tp_202500</td>
</tr>
<tr>
<td>MY_item_NAME2</td>
<td>tp_20230</td>
</tr>
</table>
</body>
</html>
渲染
假设我有一个用 dtd 声明的 XML 文件,例如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE box SYSTEM "box.dtd">
<box>
<title>My Powerful BOX</title>
<tape_list>
<tape tid="tr_1" name="tp_2000"/>
<tape tid="tr_2" name="tp_20230"/>
<tape tid="tr_3" name="tp_200412"/>
<tape tid="tr_4" name="tp_202530341"/>
<tape tid="tr_5" name="tp_20320"/>
<tape tid="tr_6" name="tp_202340"/>
<tape tid="tr_7" name="tp_20253"/>
<tape tid="tr_8" name="tp_202613"/>
<tape tid="tr_9" name="tp_20234"/>
<tape tid="tr_10" name="tp_234000"/>
<tape tid="tr_11" name="tp_202500"/>
<tape tid="tr_12" name="tp_201200"/>
</tape_list>
<item_list>
<item item_id="No_1">
<item_info item_name="MY_item_NAME"/>
<tapes ref_id="tr_10 tr_11 tr_4"/>
</item>
<item item_id="No_2">
<item_info item_name="MY_item_NAME2"/>
<tapes ref_id="tr_2"/>
</item>
</item_list>
</box>
我正在制作一个 xsl 来显示来自 item_list 的 table 个项目。我想显示来自 tape_list/tape/@name 的 item_list/item/tapes 名称,但请记住 ref_id 类型是 IDREF,tid 是唯一 ID。类似的东西:
<--Outside of xsl:template-->
<xsl:key name="tape" match="tape_list/tape" use="@tid"/>
<--------------------------->
<table border="1">
<xsl:for-each select="box/item_list/item">
<tr bgcolor="#9acd32">
<th>title</th>
<th>used tapes</th>
</tr>
<tr>
<td>
<xsl:value-of select="./item_info/@item_name"/>
</td>
<td>
<xsl:for-each select="key('tape', tapes/@ref_id)">
<xsl:value-of select="@name"/>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
但是此 returns 信息仅适用于项目 NO_2,returns 与 NO_1 无关。我的问题是为什么会发生这种情况以及如何显示相应 ID 的名称?
P.S: 我正在使用 xsl 版本 2.0
您没有post预期的结果。我猜你想做这样的事情:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="tape" match="tape_list/tape" use="@tid"/>
<xsl:template match="/box">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>title</th>
<th>used tapes</th>
</tr>
<xsl:for-each select="item_list/item">
<tr>
<td>
<xsl:value-of select="item_info/@item_name"/>
</td>
<td>
<xsl:value-of select="key('tape', tokenize(tapes/@ref_id, ' '))/@name" separator=", "/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
根据您的输入,这将产生:
结果
<!DOCTYPE HTML><html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>title</th>
<th>used tapes</th>
</tr>
<tr>
<td>MY_item_NAME</td>
<td>tp_202530341, tp_234000, tp_202500</td>
</tr>
<tr>
<td>MY_item_NAME2</td>
<td>tp_20230</td>
</tr>
</table>
</body>
</html>
渲染