XSLT返回原子值

时间:2019-03-12 12:03:53

标签: xml xslt

例如,我有以下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>

我想要一个转换,以仅获取具有B个子元素的A个元素的H个元素。我写了以下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>

输出为(使用Notepad ++的XML Tools插件):

<?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 个答案:

答案 0 :(得分:1)

当您这样做:

<xsl:apply-templates/>

您正在将模板应用于Root元素。您没有与Root匹配的模板,因此它由built-in template rules处理。这些模板递归处理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>