我正在尝试将一个节点移动到它的前一个兄弟姐妹的孩子中,而一切都在同一级别上的事实让我有点棘手。
我的输入说明:
<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>
我试图做的是将这两个<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。” 我不熟悉分析字符串,但如果我在分析字符串之外运行我的选择副本并且只是在模板中,它运行良好。
抱歉,这个问题有点长,但我想分享到目前为止我所拥有的一切。
提前致谢。