XSLT-检测元素之间的文本

XSLT-检测元素之间的文本,xslt,xpath,Xslt,Xpath,我正在进行一个转换,将相同类型的连续元素包装成单个元素,但前提是节点之间没有文本 例如: <foo>ABC</foo><foo>DEF</foo> <foo>GHI</foo> <foo>JKL</foo> <foo>ABC</foo><foo>DEF</foo> some text in between <foo>GHI</fo

我正在进行一个转换,将相同类型的连续元素包装成单个元素,但前提是节点之间没有文本

例如:

<foo>ABC</foo><foo>DEF</foo> <foo>GHI</foo>
  <foo>JKL</foo>
<foo>ABC</foo><foo>DEF</foo> some text in between <foo>GHI</foo>
  <foo>JKL</foo>
但这并不是说元素之间存在空间。在完整模板匹配中还有其他条件,但这是无法按预期工作的部分

我编写了一个测试转换来输出在元素后面的文本上使用normalizespace函数的值,它为元素之间有空格的行输出一个空格。但是,如果我查询:

foo[following-sibling::node()[1][normalize-space()=' ']]
它找不到这些元素。所以,我完全糊涂了。
任何帮助都将不胜感激

假设您可以使用XSLT2.0

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:template match="*[foo]">
        <xsl:copy>
            <xsl:for-each-group select="node()" group-adjacent="boolean(self::foo | self::text()[not(normalize-space())])">
                <xsl:choose>
                    <xsl:when test="current-grouping-key()">
                        <bar>
                            <xsl:apply-templates select="current-group()"/>
                        </bar>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="current-group()"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

[normalize space=]或[notnormalize space]似乎不起作用的问题是,在两个位置中存在非中断空格而不是常规空格。我更新了模板匹配以使用[notnormalize spacetranslate.,'&160;','',并且成功了

您是否可以使用XSLT 2.0处理器为每个组选择=节点组相邻=booleanself::foo | self::text[notnormalize space]?我已经尝试在选择中使用[notnormalize space],它也有同样的问题。谢谢。我会考虑修改我的具体情况,这实际上是更复杂的。我在每个元素之间有一个元素,而不是实际的相邻元素。因此,我实际上需要寻找等。我需要防止单体被包裹。结果表明,[notnormalize space]似乎不起作用的问题是,在一些地方存在非破坏性空格,而不是常规空格。我更新了模板匹配以使用[notnormalize spacetranslate.,'&160;','',并且成功了。不过,与我以前的转换相比,我更喜欢分组方法。再次感谢。
foo[following-sibling::node()[1][normalize-space()='']]
foo[following-sibling::node()[1][normalize-space()=' ']]
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:template match="*[foo]">
        <xsl:copy>
            <xsl:for-each-group select="node()" group-adjacent="boolean(self::foo | self::text()[not(normalize-space())])">
                <xsl:choose>
                    <xsl:when test="current-grouping-key()">
                        <bar>
                            <xsl:apply-templates select="current-group()"/>
                        </bar>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="current-group()"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:transform>