对此抱歉,但我对xsl的了解并不是很棒 我有一些代码用于从不同数量的节点构建一个3列表:
<xsl:variable name="t-size" select="count(NewDataSet/VehicleDetail/Options/Option)"/>
<xsl:variable name="myCount" select="ceiling($t-size div 3)"/>
<table callpadding="4" cellspacing="0" border="0" id="specificationTbl">
<xsl:for-each select="NewDataSet/VehicleDetail/Options/Option[position() <= $myCount]">
<xsl:variable name="here" select="position()"/>
<tr>
<td class="stiDetail"><xsl:value-of select="."/></td>
<td class="stiDetail"><xsl:choose>
<xsl:when test="../Option[$here+$myCount]">
<xsl:value-of select="../Option[$here+$myCount]/."/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</td>
<td class="stiDetail"><xsl:choose>
<xsl:when test="../Option[$here+$myCount+$myCount]">
<xsl:value-of select="../Option[$here+$myCount+$myCount]/."/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose></td>
</tr>
</xsl:for-each>
</table></td>
这很好用。但我所追求的是循环扫描节点的字符串值,然后从包含字符串的节点之后的节点开始。
EG。这是一个示例XML
<options>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>hello world</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
</options>
所以在上面的xml中,我想扫描包含单词“world”的节点,然后从以下节点IE开始创建表。从第6位开始。
希望这是有道理的。
非常感谢任何帮助。
非常感谢,
安迪。
答案 0 :(得分:0)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/options">
<table>
<xsl:apply-templates select="option[contains(., 'world')] | option[contains(., 'world')]/following-sibling::option"/>
</table>
</xsl:template>
<xsl:template match="option">
<tr>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
输出:
<table>
<tr>
<td>hello world</td>
</tr>
<tr>
<td>something</td>
</tr>
<tr>
<td>something</td>
</tr>
<tr>
<td>something</td>
</tr>
<tr>
<td>something</td>
</tr>
<tr>
<td>something</td>
</tr>
<tr>
<td>something</td>
</tr>
</table>
答案 1 :(得分:0)
使用强>:
/*/*[(.|preceding-sibling::*)[contains(text(),'world')]]
这个XPath表达式可能是最短的选择完全所需的元素集。
基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*[(.|preceding-sibling::*)[contains(.,'world')]]"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<options>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>hello world</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
</options>
产生了想要的正确结果:
<option>hello world</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
或者,您可以进行此转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="*[(.|preceding-sibling::*)[contains(text(),'world')]]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>