Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT-将self-node text()放置到属性_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

Xml XSLT-将self-node text()放置到属性

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

我有一个示例xml,如下所示

<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(), ' '))}">

这将在所有文本节点之间加入一个额外的空间,然后“规格化”将两个相邻的空间压缩为一个