使用XSL的XML到HTML - 检查节点内容

时间:2010-12-07 15:15:14

标签: html xml web-services xslt

<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被忽略”)

谢谢!

3 个答案:

答案 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'(所有后代文本节点的连接),第三次覆盖内置文本节点规则(输出字符串值)具有空规则(无输出)。