XSLT,获取除一个以外的所有后代文本节点

时间:2015-08-31 12:43:18

标签: xml xslt

有这样的转换应该获取所有后代文本节点,除了后代元素mslTTSRepl,而不是它我想获得其@repl的值。 `

<xsl:output indent="yes"/>

<xsl:template  match="text()"/>

<xsl:template match="//*[contains(@role, 'tts') and @xml:id]">
    <xsl:variable name="allText">
        <xsl:copy-of select=".//text()[not(ancestor::mslTTSRepl)]|.//mslTTSRepl/@repl"/>
    </xsl:variable>
    <xsl:element name="item">
        <xsl:attribute name="id">
            <xsl:value-of select="@xml:id"/>
        </xsl:attribute>
        <xsl:copy-of select="normalize-space($allText)"/>
    </xsl:element>

    <xsl:apply-templates/>
</xsl:template>



<xsl:template match="//*[contains(@role, 'tts') and not(@xml:id)]">
    <xsl:message>There is elements with role="tts" but without Id.</xsl:message>
</xsl:template>

<xsl:template match="/">
    <xsl:element name="tts">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

`

示例输入: `

<para role="tts" xml:id="qwe">One text 
   <d> another text<h>third text</h></d> 
   <mslTTSRepl repl="replace text">unness text</mslTTSRepl>
    last text
</para>

输出示例:

<tts>
    <item id="qwe">One text another text third text replace text last text</item>
</tts>

但现在它返回运行时错误

Error at xsl:copy-of on line 19 of file:/D:/projects/msl/tools/msl.framework/tts.xsl:
Cannot write an attribute when there is no open start tag
Transformation failed: Run-time errors were reported

1 个答案:

答案 0 :(得分:0)

问题在于您尝试将属性复制到变量中 - 并且您没有元素可用作属性的父级。尝试更改此内容:

<xsl:variable name="allText">
        <xsl:copy-of select=".//text()[not(ancestor::mslTTSRepl)]|.//mslTTSRepl/@repl"/>
</xsl:variable>

为:

<xsl:variable name="allText">
    <xsl:for-each select=".//text()[not(ancestor::mslTTSRepl)]|.//mslTTSRepl/@repl">
        <xsl:value-of select="."/>
    </xsl:for-each>
</xsl:variable>