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 / ph /のテキストを含めずに、/ data /のテキストのみを指すにはどうすればよいですか?

私の出力は次のようになります:FooFooBarではなくFooBar。

4

1 に答える 1

2

XSLがでテキストを選択する/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 に答える