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