有这样的转换应该获取所有后代文本节点,除了后代元素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
答案 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>