首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过XSLT在两个自结束标记之间选择文本

通过XSLT在两个自结束标记之间选择文本
EN

Stack Overflow用户
提问于 2020-01-28 02:53:42
回答 3查看 318关注 0票数 1

我试图选择与某些自关闭标记元素相邻的文本。这是我到目前为止所得到的。

资料来源:

代码语言:javascript
运行
复制
<markers>
    <self_closing_marker id="1"/> Some content, possible <othernodes>nodes with text</othernodes>
    <self_closing_marker id="2-3"/> Some more content
</markers>

XSLT:

代码语言:javascript
运行
复制
<xsl:template name="markers" match="self_closing_marker">
    <xsl:value-of select="following-sibling::text()" />
</xsl:template>

问题是下面的同级将选择所有内容,直到当前包装器结束为止。我发现了一些解决方案,将当前的同级作为变量,并在此基础上使用前面的兄弟关系,但是每当我实现这些解决方案时,我都会得到空标记。

最终的目标是得到一些类似于

代码语言:javascript
运行
复制
<markers>
    <marker id="1">Some content, possible nodes with text</marker>
    <marker id="2-3">Some more content</marker>
</markers>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-28 04:25:39

一种方法是为变量end分配一个following-sibling::轴上的第一个self_closing_marker元素。

然后,为text()轴上的following::节点应用谓词过滤器,通过比较生成的id值,测试是否存在$end,以及该text()后面的第一个self_closing_marker元素是否与$end相同。

代码语言:javascript
运行
复制
<xsl:template name="markers" match="self_closing_marker">
    <xsl:variable name="end" select="following-sibling::self_closing_marker[1]"/>
    <xsl:value-of select="following::text()[
                            $end 
                            and generate-id(following::self_closing_marker[1]) = generate-id($end)
                          ]" />
</xsl:template>
票数 1
EN

Stack Overflow用户

发布于 2020-01-28 06:11:33

你可以从相反的角度看这个:

XSLT1.0

代码语言:javascript
运行
复制
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="txt" match="text()" use="generate-id(preceding::self_closing_marker[1])" />

<xsl:template match="/markers">
    <xsl:copy>
        <xsl:apply-templates select="self_closing_marker"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="self_closing_marker">
    <marker id="{@id}">
        <xsl:copy-of select="key('txt', generate-id())"/>
    </marker>
</xsl:template>

</xsl:stylesheet>

演示:https://xsltfiddle.liberty-development.net/bwe3bR/1

如果不想输出空标记节点,请向模板的匹配模式添加一个谓词:

代码语言:javascript
运行
复制
<xsl:template match="self_closing_marker[key('txt', generate-id())]">
票数 1
EN

Stack Overflow用户

发布于 2020-01-28 08:12:14

如果您准备使用Saxon扩展函数(需要PE或更高版本),可以使用:

代码语言:javascript
运行
复制
saxon:leading(
   following-sibling::node(), 
   function($x){exists($x/self::marker)})

请参阅http://www.saxonica.com/documentation/index.html#!functions/saxon/leading

函数返回序列中的所有项,直到提供的谓词返回true的第一项为止。

您也可以自己实现这个函数,但是由于它使用的是高阶函数,所以仍然需要Saxon或更高级别的函数。

否则,使用其他人提出的解决方案之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59941584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档