XSLT:过滤一些标记后规范化空间

XSLT:过滤一些标记后规范化空间,xslt,xslt-2.0,Xslt,Xslt 2.0,以下是一个源XML: <desc> first <useless> second</useless>third <useful>word</useful> </desc> 首先 第二三 单词 …我正试图“清理”,比如: 第一秒第三 单词 我的模板写作尝试从以下几点开始 <xsl:template match="desc"> <xsl:variable name=&

以下是一个源XML:

<desc> first
  <useless>  second</useless>third
  <useful>word</useful>
</desc>
首先
第二三
单词
…我正试图“清理”,比如:

第一秒第三
单词
我的模板写作尝试从以下几点开始

<xsl:template match="desc">
    <xsl:variable name="txt" select="."/>
    <xsl:variable name="txt1" select="normalize-space($txt)"/>
    <desc>
        <xsl:value-of select="$txt1"/>
    </desc>
</xsl:template>
<xsl:template match="useless">
    <xsl:variable name="txt" select="."/>
    <xsl:variable name="txt1" select="normalize-space($txt)"/>
    <xsl:value-of select="$txt1"/>
</xsl:template>

…但显然这还不够

这是结果

   <desc>first secondthird word</desc>
第一个第二个第三个单词

我做错了什么?

与您展示的结果非常相似的结果可能由以下因素产生:

XSLT2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="desc">
    <desc>
        <xsl:value-of select="normalize-space(string-join(text() | useless/text(), ' '))"/>
        <xsl:copy-of select="useful"/>
    </desc>
</xsl:template>

</xsl:stylesheet>


这是否符合你的目的还不清楚。如评论中所述,示例不能代替说明规则。

与您展示的结果非常相似的结果可以通过以下方式产生:

XSLT2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="desc">
    <desc>
        <xsl:value-of select="normalize-space(string-join(text() | useless/text(), ' '))"/>
        <xsl:copy-of select="useful"/>
    </desc>
</xsl:template>

</xsl:stylesheet>


这是否符合你的目的还不清楚。正如评论中所提到的,一个示例不能代替说明规则。

我不知道这个示例如何解释要应用于“规范化”空白的规则。要“摆脱”元素节点并仅处理其内容,只需使用例如
并使用标识模板处理其余内容即可。但我还不知道哪些空白需要保留,哪些需要去除或规范化。你甚至想插入空格,或者想要的结果中
second-third
之间的空格来自哪里?纯粹的标题“过滤后规范化”显然,可以通过以下方式来实现:首先通过删除要删除的元素的模式运行输入,将结果存储在变量中,然后通过规范化文本节点的第二种模式运行输入。只是我看不到你想要规范化的文本以及你想要在何时何地插入空格。谢谢。我不知道“模式”选项。我不知道如何使用它。。。可能是:在“无用”模板中?我看不出单个示例如何解释要应用于“规范化”空白的规则。要“摆脱”元素节点并仅处理其内容,只需使用例如
并使用标识模板处理其余内容即可。但我还不知道哪些空白需要保留,哪些需要去除或规范化。你甚至想插入空格,或者想要的结果中
second-third
之间的空格来自哪里?纯粹的标题“过滤后规范化”显然,可以通过以下方式来实现:首先通过删除要删除的元素的模式运行输入,将结果存储在变量中,然后通过规范化文本节点的第二种模式运行输入。只是我看不到你想要规范化的文本以及你想要在何时何地插入空格。谢谢。我不知道“模式”选项。我不知道如何使用它。。。可能是:在“无用”模板中?谢谢,这正好符合我的目的:(1)规范化下面的空格(2)删除下面的标记,同时保留文本(3)在删除的标记后添加空格谢谢,这正好符合我的目的:(1)规范化下面的空格(2)删除下面的标记,同时保留文本(3)在移除的标记后添加空格