我试图选择与某些自关闭标记元素相邻的文本。这是我到目前为止所得到的。
资料来源:
<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:
<xsl:template name="markers" match="self_closing_marker">
<xsl:value-of select="following-sibling::text()" />
</xsl:template>
问题是下面的同级将选择所有内容,直到当前包装器结束为止。我发现了一些解决方案,将当前的同级作为变量,并在此基础上使用前面的兄弟关系,但是每当我实现这些解决方案时,我都会得到空标记。
最终的目标是得到一些类似于
<markers>
<marker id="1">Some content, possible nodes with text</marker>
<marker id="2-3">Some more content</marker>
</markers>
发布于 2020-01-28 04:25:39
一种方法是为变量end
分配一个following-sibling::
轴上的第一个self_closing_marker
元素。
然后,为text()
轴上的following::
节点应用谓词过滤器,通过比较生成的id值,测试是否存在$end
,以及该text()
后面的第一个self_closing_marker
元素是否与$end
相同。
<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>
发布于 2020-01-28 06:11:33
你可以从相反的角度看这个:
XSLT1.0
<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
如果不想输出空标记节点,请向模板的匹配模式添加一个谓词:
<xsl:template match="self_closing_marker[key('txt', generate-id())]">
发布于 2020-01-28 08:12:14
如果您准备使用Saxon扩展函数(需要PE或更高版本),可以使用:
saxon:leading(
following-sibling::node(),
function($x){exists($x/self::marker)})
请参阅http://www.saxonica.com/documentation/index.html#!functions/saxon/leading
函数返回序列中的所有项,直到提供的谓词返回true的第一项为止。
您也可以自己实现这个函数,但是由于它使用的是高阶函数,所以仍然需要Saxon或更高级别的函数。
否则,使用其他人提出的解决方案之一。
https://stackoverflow.com/questions/59941584
复制相似问题