XML в HTML с использованием XSL - проверить содержимое узла - PullRequest
0 голосов
/ 07 декабря 2010
<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 ]

1 голос
/ 07 декабря 2010

Попробуйте это:

<xsl:template match="B[text()='Hello']" >  
   Nice to meet you 
</xsl:template>  


<xsl:template match="/" >  
   <html> 
      <body>  
         <xsl:apply-templates/>  
      </body> 
   </html> 
</xsl:template> 
0 голосов
/ 07 декабря 2010

Вам нужно три правила:

<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' в его строковом значении (объединение всехнисходящие текстовые узлы), третье правило перезаписи встроенных текстовых узлов (значение выходной строки) с пустым правилом (без вывода).

0 голосов
/ 07 декабря 2010

Как вариант Эрика, это также должно работать.Эрик более универсален, так как вы можете написать шаблон для каждого типа узла без необходимости изменения корневого шаблона.Однако, если нет соответствующего шаблона, применяется шаблон по умолчанию (что, вероятно, означает, что узел 'Goobye' выведет 'Goodbye').С другой стороны, приведенное ниже решение будет вызывать apply-templates только для узлов, где «B» содержит Hello, поэтому узел «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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...