我有这样的XML
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="do.xsl"?>
<catalog>
<cd>
<title_>Empire Burlesque</title_>
<artist>Bobby</artist>
<company>Columbia</company>
</cd>
<cd>
<title_>Shirt2</title_>
<artist>Bobby</artist>
<company>Columbia2</company>
</cd>
<cd>
<title_>Fingers</title_>
<artist>Bobby</artist>
<company>Columbia3</company>
</cd>
<cd>
<title_>Zip1</title_>
<artist>Bobby</artist>
<company>---</company>
</cd>
<cd>
<title_>Zip2</title_>
<artist>Bobby</artist>
<company>---</company>
</cd>
</catalog>
我需要用之前有意义的数据替换--- Columbia3 我接下来做
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</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:variable name="NotStarted" select="preceding-sibling::cd[1]/company" />
<xsl:choose>
<xsl:when test="company != '---'">
<xsl:value-of select="company"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$NotStarted" />
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
正如预期的那样,我得到了下一个HTML
Title Artist
Empire Burlesque Bobby Columbia
Shirt2 Bobby Columbia2
Fingers Bobby Columbia3
Zip1 Bobby Columbia3
Zip2 Bobby ---
我如何迭代以获取最后一个有意义的字符串以替换或以任何其他方式?感谢。
答案 0 :(得分:1)
这可以通过更改 NotStarted 变量
来实现<xsl:variable name="NotStarted" select="preceding-sibling::cd[1]/company" />
目前正在做的是找到前一个兄弟,无论内容如何,以及获取公司元素。您需要做的是找到具有有效公司名称的第一个兄弟姐妹
<xsl:variable name="NotStarted"
select="preceding-sibling::cd[company != '---'][1]/company/text()"/>
值得注意的是,通常最好避免在XSLT中使用 xsl:for-each 和 xsl:choose ,并尝试利用模板匹配。这是一个演示此
的备用XSLT<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</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:apply-templates select="company"/>
</td>
</tr>
</xsl:template>
<xsl:template match="company[text() = '---']">
<xsl:value-of select="../preceding-sibling::cd[company != '---'][1]/company"/>
</xsl:template>
</xsl:stylesheet>
应用于XML示例时,输出以下内容
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td>Empire Burlesque</td>
<td>Bobby</td>
<td>Columbia</td>
</tr>
<tr>
<td>Shirt2</td>
<td>Bobby</td>
<td>Columbia2</td>
</tr>
<tr>
<td>Fingers</td>
<td>Bobby</td>
<td>Columbia3</td>
</tr>
<tr>
<td>Zip1</td>
<td>Bobby</td>
<td>Columbia3</td>
</tr>
<tr>
<td>Zip2</td>
<td>Bobby</td>
<td>Columbia3</td>
</tr>
</table>
</body>
</html>