<A>
<B>Hello</B>
<B>Goodbye</B>
<B>Hello</B>
</A>
这个XSL:
<xsl:template match="/" >
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
我希望XSL只打印出B节点包含“Hello”的内容。
注意:我不想打印实际节点内容(“Hello”),我想打印其他内容,例如:
“很高兴见到你” “很高兴见到你”
(因为有2个节点存在“Hello”并且“Goodbye被忽略”)
谢谢!
答案 0 :(得分:1)
试试这个:
<xsl:template match="B[text()='Hello']" >
Nice to meet you
</xsl:template>
<xsl:template match="/" >
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
答案 1 :(得分:0)
作为Eric的变种,这也应该有效。 Eric更通用,因为您可以为每个节点类型编写模板,而无需更改根模板。但是,如果没有匹配的模板,则应用默认模板(这可能意味着'Goobye'节点将打印出'Goodbye')。另一方面,下面的解决方案只会为'B'包含Hello的节点调用apply-templates,因此忽略'Goodbye'节点(或者应该这样做;它是未经测试的,但原则应该是健全的:-) )。
<xsl:template match="node()" >
Nice to meet you
</xsl:template>
<xsl:template match="/" >
<html>
<body>
<xsl:apply-templates select="/A/B[text()='Hello']" />
</body>
</html>
</xsl:template>
答案 2 :(得分:0)
您需要三条规则:
<xsl:template match="/" >
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="B[contains(.,'HELLO')]">
<xsl:text>Nice to meet you</xsl:text>
</xsl:template>
<xsl:template match="text()"/>
注意:首先是你自己的规则,第二个是B
元素的规则,在其字符串值中包含'HELLO'(所有后代文本节点的连接),第三次覆盖内置文本节点规则(输出字符串值)具有空规则(无输出)。