2012-11-23 54 views
3

XML:XSLT选择文本没有孩子

<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="."/>它也是孩子选择文本实体数据/ ph。我如何仅指向/ data /的文本,而不包括/ data/ph /的文本?

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

回答

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

完美,所以我重写它为: 的

+0

@ user1848612,欢迎您。 –