Xml XSLT-将self-node text()放置到属性
我有一个示例xml,如下所示Xml XSLT-将self-node text()放置到属性,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个示例xml,如下所示 <doc> <para>AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style>HHHHHH</para> </doc> 正如您在输出中看到的,所有文本节点都应复制到名称属性值a,并且必须删除所有内联元素(,,)。所有的,,都必须用空格代替 我为此编写了以下xslt <xsl:templ
<doc>
<para>AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style>HHHHHH</para>
</doc>
正如您在输出中看到的,所有文本节点都应复制到名称属性值a,并且必须删除所有内联元素(,,
)。所有的
,
,
都必须用空格代替
我为此编写了以下xslt
<xsl:template match="p">
<p name="{abc:process-attr-text(child::node())}">
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:function name="abc:process-attr-text">
<xsl:param name="node"/>
<xsl:sequence select="$node/text()"/>
</xsl:function>
它给出以下输出:
<doc>
<p name="GGGG">AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style> HHHHHH</p>
</doc>
AAAAA BBBCCC dddeeeffff GGGG HHHHHH
如何修改函数以获得正确的结果?为什么不简单地:
<xsl:template match="para">
<p name="{.}">
<xsl:apply-templates/>
</p>
</xsl:template>
为什么不简单地:
<xsl:template match="para">
<p name="{.}">
<xsl:apply-templates/>
</p>
</xsl:template>
这有点尴尬,仅仅使用
的明显答案不会起作用,因为它只会连接所有的后代文本节点,给出aaaaaaa BBBCCC dddeeefff gggggghhhhh
如果您想确保相邻文本节点之间有XML标记的地方有空格,那么您需要更具创造性。试一试
<p name="{normalize-space(string-join(descendant::text(), ' '))}">
这会在所有文本节点之间加入一个额外的空格,然后“规格化”会将两个相邻的空格压缩为一个。这有点尴尬,仅仅使用
显然不起作用,因为它只会连接所有的后代文本节点,给予AAAAA BBBCCC dddeeefff gggghhhhh
如果您想确保相邻文本节点之间有XML标记的地方有空格,那么您需要更具创造性。试一试
<p name="{normalize-space(string-join(descendant::text(), ' '))}">
这将在所有文本节点之间加入一个额外的空间,然后“规格化”将两个相邻的空间压缩为一个