【问题标题】:XSLT 2.0 deleting a sibling node based on position and nameXSLT 2.0 根据位置和名称删除同级节点
【发布时间】:2018-10-18 10:29:50
【问题描述】:

我有时会在 xml 文件(命名空间 tei)中出现以下内容:

<tei:p>some text</tei:p><tei:add>some note</tei:add>

我的目标是删除&lt;add/&gt;,仅当它是&lt;p&gt; 之后的下一个兄弟元素,而不是可能出现在文件中的其他&lt;add/&gt; 元素。

我在 XSLT 2.0 中尝试过,但没有效果:

<xsl:template match="tei:add[preceding-sibling::node()[1][local-name()='p']]"/>

感谢您的帮助。

【问题讨论】:

  • 对于您显示的 XML sn-p,模板匹配应该可以工作(请参阅 xsltfiddle.liberty-development.net/3NzcBtV )。但是,它可能无法匹配的一个原因是,如果您在 padd 之间有一个空白节点(如新行)。
  • 啊,是的,可能是换行问题。

标签: xslt xpath


【解决方案1】:

您展示的代码示例应该可以工作,但前提是padd 之间没有空格(例如换行)(因为文本也算作节点)

如果您可以在它们之间有一个您想忽略的空白节点,一种解决方案是通过在您的 XSLT 中使用 strip-space 从 XML 中去除只有空白的节点

<xsl:strip-space elements="*" />

或者,您可以更改模板匹配以考虑空白节点

 <xsl:template match="tei:add[preceding-sibling::node()[self::* or normalize-space()][1][local-name()='p']]"/>

如果它们之间永远不能有非空白节点,则可以将其更改为此

<xsl:template match="tei:add[preceding-sibling::*[1][local-name()='p']]"/>

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 2016-10-11
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多