当我将 XML 结构更改为具有多个这样的良好实体时,如何使工作成为此处描述的解决方案:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Work>
<Good id = "1">
<list num="1050" id = "2531" desc="List 1">
<part num="1">
<pos isKey="0" id="2532" pid="2531" desc="Part 1" />
<pos num="1.2." isKey="0" id="2554" pid="2532" desc="Position 1.2" />
<pos num="1.2.6." isKey="1" id="2591" pid="2554" desc="Position 1.2.6" />
</part>
</list>
<list num="1090" id = "3029" desc="List 2">
<part num="2">
<pos isKey="0" id="3033" pid="3029" desc="Category 2" />
<pos isKey="0" id="3040" pid="3033" desc="Part 9" />
<pos num="9.2." isKey="0" id="3333" pid="3040" desc="Position 9.2" />
<pos num="9.2.1." isKey="0" id="3334" pid="3333" desc="Position 9.2.1" />
<pos num="9.2.1.2" isKey="1" id="3339" pid="3334" desc="Position 9.2.1.2" />
</part>
</list>
</Good>
<Good id = "2">
<list num="1050" id = "2531" desc="List 3">
<part num="1">
<pos isKey="0" id="2532" pid="2531" desc="Part 1" />
<pos num="1.2." isKey="0" id="2554" pid="2532" desc="Position 1.2" />
<pos num="1.2.6." isKey="0" id="2591" pid="2554" desc="Position 1.2.6" />
<pos num="1.2.6.1." isKey="1" id="2592" pid="2591" desc="Position 1.2.6.1" />
</part>
</list>
</Good>
</Work>
我试图为 Work/Good 实体创建一个 for-each 循环,但它没有帮助:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />
<!-- key to look up any element with an id attribute based on the value of
that id -->
<xsl:key name="elementsByPid" match="*[@pid]" use="@pid" />
<xsl:template match="/">
<html>
<body>
<h2>Lists</h2>
<xsl:apply-templates select="Work/Goods" />
</body>
</html>
</xsl:template>
<xsl:template match="Work/Goods">
<xsl:for-each select="Work/Goods">
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:apply-templates select="Work/Goods/list" />
</xsl:template>
<xsl:template match="Work/Goods/list">
<xsl:for-each select="Work/Goods/list">
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:apply-templates select="." mode="table"/>
</xsl:template>
<xsl:template match="*" mode="table">
<xsl:variable name="shouldOutput">
<xsl:apply-templates select="." mode="shouldOutput" />
</xsl:variable>
<xsl:if test="string-length($shouldOutput)">
<table>
<xsl:apply-templates select="." />
</table>
</xsl:if>
</xsl:template>
<!-- the main recursive logic - first produce output for this row, then
process any of the children (in the id->pid chain) that need to be
output -->
<xsl:template match="*">
<xsl:apply-templates select="." mode="row" />
<xsl:for-each select="key('elementsByPid', @id)">
<xsl:variable name="shouldOutput">
<xsl:apply-templates select="." mode="shouldOutput" />
</xsl:variable>
<xsl:if test="string-length($shouldOutput)">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="*" mode="row">
<tr>
<td colspan="2"><xsl:value-of select="@desc" /></td>
</tr>
</xsl:template>
<!-- special case for pos elements with a @num - produce two columns -->
<xsl:template match="pos[@num]" mode="row">
<tr>
<td><xsl:value-of select="@num" /></td>
<td><xsl:value-of select="@desc" /></td>
</tr>
</xsl:template>
<!-- check whether this node should be output by checking whether it, or any
of its descendants in the id->pid tree, has @out=1. The template will
return an empty RTF for nodes that should not be output, and an RTF
containing a text node with one or more "1" characters for nodes that
should. -->
<xsl:template match="*[@out='1']" mode="shouldOutput">1</xsl:template>
<xsl:template match="*" mode="shouldOutput">
<xsl:apply-templates select="key('elementsByPid', @id)"
mode="shouldOutput"/>
</xsl:template>
</xsl:stylesheet>
enter code here
在模板中不允许此代码工作。
我还应该改变什么才能让它工作?