XSLT选择没有子项的文本

时间:2012-11-23 23:05:48

标签: xslt xpath

XML:

<data><ph>Foo</ph>Bar</data>

XSL:

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <xsl:apply-templates select="data/ph"/>
    <xsl:apply-templates select="data"/>
</xsl:template>
<xsl:template match="data/ph">
    <xsl:value-of select="."/>
 </xsl:template>
<xsl:template match="data">
    <xsl:value-of select="."/>
</xsl:template>

当XSL选择带有<xsl:template match="data"><xsl:value-of select="."/>的/ data /中的文本时,它还选择子实体data / ph中的文本。如何仅指向/ data /的文本,而不包括/ data / ph /?

的文本

我的输出应该是:FooBar,而不是FooFooBar。

1 个答案:

答案 0 :(得分:2)

  

当XSL选择带有/data/的{​​{1}}中的文字时,它也会选择文字   在子实体<xsl:template match="data"><xsl:value-of select="."/>中。我如何仅指向文本   data/ph,不包括/data/的文字?

使用

/data/ph/

这将复制当前节点的所有文本节点子节点。

通过此更正,整个转换变为

<xsl:copy-of select="text()"/>

并应用于提供的XML文档

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:apply-templates select="data/ph"/>
        <xsl:apply-templates select="data"/>
    </xsl:template>

    <xsl:template match="data/ph">
        <xsl:value-of select="."/>
     </xsl:template>

    <xsl:template match="data">
        <xsl:copy-of select="text()"/>
    </xsl:template>
</xsl:stylesheet>

产生了想要的正确结果

<data><ph>Foo</ph>Bar</data>