Не удается получить правильный вывод XSLT - PullRequest
1 голос
/ 21 февраля 2012

У меня есть такой 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

Я использовал функцию 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>

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

Спасибо!.

John

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Две альтернативы, которые дают одинаковый результат:

<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> 
1 голос
/ 21 февраля 2012

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

 <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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...