我正在尝试转换以下XML
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd QualifyingCode="1">
<title>title1</title>
<artist>artist1</artist>
</cd>
<cd QualifyingCode="1">
<title>title2</title>
<artist>artist2</artist>
</cd>
<cd QualifyingCode="2">
<title>title3</title>
<artist>artist3</artist>
</cd>
<cd QualifyingCode="2">
<title>title4</title>
<artist>artist4</artist>
</cd>
</catalog>
使用流式XSLT
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">ID</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="position()"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我使用position()获得位置为1,2,3,4。我想要的是position()的输出应该是基于" qualiifyingcode "属性的1,2,1,2。
所以我当前的输出是:
My CD Collection
Title Artist ID
title1 artist1 1
title2 artist2 2
title3 artist3 3
title4 artist4 4
,我的期望输出是
My CD Collection
Title Artist ID
title1 artist1 1
title2 artist2 2
title3 artist3 1
title4 artist4 2
一种方法是使用
<td><xsl:value-of select="count(preceding-sibling::cd[@QualifyingCode = current()/@QualifyingCode]) + 1"/></td>
我想要的是位置()的输出应该是1,2,1,2基于
" QualifyingCode "属性。
这不是一个足够明确的要求,而且这个例子也很含糊。假设您希望在QualifyingCode属性更改时重新开始编号,您应该使用xsl:number
:
<xsl:number from="cd[@QualifyingCode!=preceding-sibling::cd[1]/@QualifyingCode]" level="any" />
请注意,这是,而不是,与使用相同的qualiifyingcode计数前面的兄弟姐妹相同;如果您在当前列表中添加另一个带有@QualifyingCode=1的cd,则差异将变得明显。
我对xslt做了两个更改:一个是通常使用模板比for-each更好。另一个通过计算具有相同QualifyingCode
的兄弟姐妹来专门解决您的问题:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">ID</th>
</tr>
<xsl:apply-templates select="catalog/cd"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="count(preceding-sibling::cd[@QualifyingCode =
current()/@QualifyingCode]) + 1"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>