XPath:连接节点内的文本及其直接跟随的同级文本



我是XSLT和XPath的初学者,主要通过示例学习并参与项目。

我正在尝试连接两个节点的text()内容。对于节点a的每个出现,节点atext()内容应该与下一个兄弟节点btext()内容级联。该连接的内容应在与节点a相同的位置注册为text()新节点foo

示例输入:

<html>
<body>
<a>First text</a>
<b>Text</b>
<c>Indiferent tag.</c>
<a>Another "a" test.</a>
<b>ěščřžýáíéúů</b>
<c>Another indiferent tag.</c>
</body>
</html>

预期(希望(产出:

<html>
<body>
<foo>First text Text</foo>
<c>Indiferent tag.</c>
<foo>Another "a" test. ěščřžýáíéúů</foo>
<c>Another indiferent tag.</c>
</body>
</html>

我当前使用的样式表:

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

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

<xsl:template match="html/body/a">
<foo>
<xsl:value-of select="concat(text(), folowing-sibling::b[1]/text())"/>
</foo>
</xsl:template>

只是因为XPath语句错误而出错。

如何改进样式表以获得所需的结果?

注意:我知道存在以下问题及其答案:这里,这个精彩的答案和其他问题,但我很难将它们应用于我的具体案例。

此外,对于这个项目,我坚持使用python lxml;我相信我只能使用XSLT1.0和XPath1.0。这些都是我希望任何善良的人都能帮助我遵守的限制。然而,我是用saxon学习的,所以从学习的角度来看,使用高级版本的解决方案也很好。

最后,这只是一个来自较大HTML文件的示例片段,我正试图将其转换为有效的(对于我的用例来说很方便(XML,并且涉及到很多分组(我最终也需要按关键字foo进行分组(,因此解决方案最好使用身份转换重载,这将使我能够在本示例之外使用它。。。

这里有一种方法可以做到这一点。

不过,不确定你在问题末尾的分组评论。。。

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

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

<xsl:template match="a">
<foo>
<xsl:value-of select="concat(., following-sibling::b[1])"/>
</foo>
</xsl:template>

<!-- Remove b nodes -->
<xsl:template match="b"/>

</xsl:stylesheet>

请在此处查看它的工作情况:https://xsltfiddle.liberty-development.net/jxDjin9

相关内容

  • 没有找到相关文章

最新更新