XSLT возвращает атомарные значения - PullRequest
0 голосов
/ 12 марта 2019

В качестве примера у меня есть следующий XML:

<Root>
  <A>
    <H>header1</H>
    <B>
        <C>2</C>
    </B>
  </A>
  <A>
    <H>header2</H>
    <B>
        <C>3</C>
    </B>
  </A>
  <A>
    <H>header3</H>
  </A>
  <A>
    <H>header4</H>
  </A>
</Root>

Я хочу преобразование, чтобы получить H элементов только из элементов A, которые имеют дочерний элемент B.Я написал следующий XSLT:

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform">   

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

<xsl:template match="A[B]"> 
    <Row>
        <Result>
            <xsl:value-of select="H"/>
        </Result>
    </Row>
</xsl:template>  
</xsl:stylesheet>

Вывод (с помощью плагина XML Tools для Notepad ++):

<?xml version="1.0"?>
<Root>
  <Row><Result>header1</Result></Row>
  <Row><Result>header2</Result></Row>

    header3


    header4

</Root>

Почему существуют только простые строки "header3" и "header4"?Я ожидал следующего:

<?xml version="1.0"?>
<Root>
  <Row><Result>header1</Result></Row>
  <Row><Result>header2</Result></Row>
</Root>

1 Ответ

1 голос
/ 12 марта 2019

Когда вы делаете:

<xsl:apply-templates/>

, вы применяете шаблоны к элементу Root.У вас нет шаблона, соответствующего Root, поэтому он обрабатывается встроенными правилами шаблона .Эти шаблоны рекурсивно обрабатывают Root и всех его потомков (за исключением A[B], для которого у вас есть шаблон) и копируют все текстовые узлы в вывод.

Попробуйте вместо этого:

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

<xsl:template match="/Root">
    <Root>
        <xsl:apply-templates select="A[B]"/>
    </Root>
</xsl:template>

<xsl:template match="A"> 
    <Row>
        <Result>
            <xsl:value-of select="H"/>
        </Result>
    </Row>
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...