3

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 选择 /data/ 中的文本时,<xsl:template match="data"><xsl:value-of select="."/>它也在选择子实体 data/ph 中的文本。如何仅指向 /data/ 的文本,而不包括 /data/ph/ 的文本?

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

4

1 回答 1

2

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

使用

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

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

通过这个修正,整个变换变成

<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>

当应用于提供的 XML 文档时

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

产生了想要的正确结果

FooBar
于 2012-11-23T23:10:31.853 回答