2012-02-21 3 views
1

У меня есть XML, как это:Не удается получить правильный вывод XSLT

<Section> 
    <Chapter> 
     <Head>Heading</Head> 
     <nametable> 
      <nametitle>MyTitle</nametitle> 
      <namedomain>MyDomain</namedomain> 
      <namevalue>value1</namevalue> 
     </nametable> 
     <nametable> 
      <nametitle>MyTitle2</nametitle> 
      <namedomain>MyDomain2</namedomain> 
      <namevalue>value2</namevalue> 
     </nametable> 
    </Chapter> 
</Section> 

я хотел бы получить этот результат:

MyTitle2 
MyDomain2 
value2 

Я использовал text() функцию для проверки текста но ничего не печатает.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

<xsl:template match="//Chapter"> 
    <xsl:comment>Ignore Head tag</xsl:comment> 
    <xsl:apply-templates select="*[not(self::Head)]"/> 
</xsl:template> 

<xsl:template match="nametable"> 
    <xsl:for-each select="nametitle"> 
     <xsl:if test="text()='MyTitle2'"> 
      <xsl:apply-templates select="nametitle" /> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="nametitle"> 
    <xsl:apply-templates /> 
</xsl:template> 

</xsl:stylesheet> 

Что я сделал не так?.

Спасибо !.

Джон

ответ

1

Ваша проблема здесь:

<xsl:for-each select="nametitle"> 
    <xsl:if test="text()='MyTitle2'"> 
     <xsl:apply-templates select="nametitle" /> 
    </xsl:if> 
</xsl:for-each> 

Если проверка прошла успешно, то шаблоны будут применены к nametitle ребенка текущего узла.

Однако текущий узел nametitle и не имеет nametitle детей - поэтому никакие узлы не будут выбраны и не применяются не шаблоны.

Решение:

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="text"/> 

<xsl:template match="nametable[nametitle = 'MyTitle2']/*"> 
    <xsl:value-of select="."/> 
    <xsl:text>&#xA;</xsl:text> 
</xsl:template> 

<xsl:template match="text()"/> 
</xsl:stylesheet> 

при нанесении на поставленном XML документа:

<Section> 
    <Chapter> 
     <Head>Heading</Head> 
     <nametable> 
      <nametitle>MyTitle</nametitle> 
      <namedomain>MyDomain</namedomain> 
      <namevalue>value1</namevalue> 
     </nametable> 
     <nametable> 
      <nametitle>MyTitle2</nametitle> 
      <namedomain>MyDomain2</namedomain> 
      <namevalue>value2</namevalue> 
     </nametable> 
    </Chapter> 
</Section> 

производит разыскиваемого, правильный результат:

 MyTitle2 
     MyDomain2 
     value2 
+0

Спасибо, я ценю вашу помощь !. – JohnX

+0

@JohnX: Я рад, что мой ответ был полезен для вас. Пожалуйста, подумайте о принятии этого ответа (подсказка: нажав галочку рядом с ответом). –

+0

У меня есть один вопрос, если я заменил '' На '' и предоставил соответствие шаблону для nametitle (который содержит ) ваше решение будет печатать MyTitle вместо MyTitle2. Мне интересно, почему это потому, что проверка - MyTitle2. – JohnX

2

две альтернативы, которые производят один и тот же результат:

<xsl:template match="nametitle[text()='MyTitle2']"> 
<xsl:value-of select="parent::node()"/> 
<xsl:text>&#xA;</xsl:text> 
</xsl:template> 

и

<xsl:template match="*[nametitle[text()='MyTitle2']]"> 
<xsl:value-of select="."/> 
<xsl:text>&#xA;</xsl:text> 
</xsl:template> 
+0

Спасибо, я ценю вашу помощь !. – JohnX

Смежные вопросы