gpt4 book ai didi

xml - 将节点的文本字符串添加到其 previous sibling 节点的子文本字符串中

转载 作者:行者123 更新时间:2023-12-03 17:17:31 28 4
gpt4 key购买 nike

我正在尝试将一个节点移动到它的前一个 sibling 的 child 中,而一切都在同一级别上的事实让我有点棘手。

我的输入说明:

<dl>
<dlentry>
<dt> Title 1 </dt>
<dd> Title 1's definition </dd>
<dt> Title 2 </dt>
<dd> Title 2's definition </dd>
<dt> Title 3 </dt>
<dd> Title 3's definition </dd>
</dlentry>
</dl>
<p> part of title 3's definition </p>
<p> another part of title 3's definition </p>

我想要做的是把那些 2 <p>底部的元素并将它们的文本连接到最后一个 <dd> 的末尾 <dlentry> 中元素的文本因为它们是“标题 3”定义的一部分。

期望的输出:
<dl>
<dlentry>
<dt> Title 1 </dt>
<dd> Title 1's definition </dd>
<dt> Title 2 </dt>
<dd> Title 2's definition </dd>
<dt> Title 3 </dt>
<dd> Title 3's definition part of title 3's definition another part of title 3's definition </dd>
</dlentry>
</dl>

我正在处理的另一个问题是因为 XHTML 在我的源文档中有多糟糕,我需要对那些 <p> 的文本进行正则表达式匹配。元素以确保它不会碰到文档中的其他任何地方。

我能够成功插入第一个 <p>的文本,但无法使其正常工作,因此我可以进行正则表达式匹配,并将第二个元素的文本也放入所需的位置。

这是我的样式表中使用 XSLT 2.0 的代码片段。
<xsl:analyze-string select="."
regex="my regex expression here">

<xsl:template match="dlentry">

<xsl:matching-substring>
<dlentry>
** <xsl:copy-of select="node()[ position() lt last()]"/>
<dd>
<xsl:copy-of select="node()[last()]/text()" />
<xsl:copy-of select=" parent::node()/following-sibling::node()[1]/text()"/>
</dd>
</dlentry>
</xsl:matching-substring>

<xsl:non-matching-substring>
<xsl:value-of select=".">
</xsl:non-matching-substring>

</xsl:template>

<xsl:template match="p[preceding-sibling::node()[1][self::node()[name(.)='dl']]]" />
<xsl:template match="p[preceding-sibling::node()[2][self::node()[name(.)='dl']]]" />

在带有 ** 星号的代码行中,Saxon 抛出一个错误,提示“Axis step child::node() cannont be used here: the context item is an atomic value。”我不熟悉分析字符串,但如果我在分析字符串之外运行我的选择副本并且只是在模板中,它运行良好。

抱歉,这个问题有点长,但我想分享到目前为止我所拥有的一切。

提前致谢。

最佳答案

这个简短的 XSLT 1.0 (当然它也是 XSLT 2.0):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="kFollowing" match="p" use="generate-id(preceding-sibling::dl[1])"/>

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

<xsl:template match="dlentry/dd[last()]">
<dd>
<xsl:apply-templates select=
"(.|key('kFollowing', generate-id(ancestor::dl[1])))/text()"/>
</dd>
</xsl:template>
<xsl:template match="p"/>
</xsl:stylesheet>

应用于提供的 XML 文档时 :
<html>
<dl>
<dlentry>
<dt> Title 1 </dt>
<dd> Title 1's definition </dd>
<dt> Title 2 </dt>
<dd> Title 2's definition </dd>
<dt> Title 3 </dt>
<dd> Title 3's definition </dd>
</dlentry>
</dl>
<p> part of title 3's definition </p>
<p> another part of title 3's definition </p>
</html>

产生想要的正确结果:
<html>
<dl>
<dlentry>
<dt> Title 1 </dt>
<dd> Title 1's definition </dd>
<dt> Title 2 </dt>
<dd> Title 2's definition </dd>
<dt> Title 3 </dt>
<dd> Title 3's definition part of title 3's definition another part of title 3's definition </dd>
</dlentry>
</dl>
</html>

关于xml - 将节点的文本字符串添加到其 previous sibling 节点的子文本字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12502111/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com