仅当前一个兄弟节点的 child 不是某个节点时才匹配 XSL 模板

XSL template match only if a preceding sibling's child is not a certain node

我有一个很像 this one 的特定问题,但在我的例子中,我只想匹配前面任何一个兄弟节点的 child 不包含某个节点。

在我的例子中,我有来自 Word 文档的 XML:

<w:r>
    <w:drawing>

    </w:drawing>
</w:r>
<w:r w:rsidR="00AE7312">
    <w:rPr>
        <w:i/>
        <w:iCs/>
        <w:w w:val="100"/>
    </w:rPr>
    <w:t>Some italic text</w:t>
</w:r>

我想避免同时包含 w:iw:drawingw:r's。 到目前为止我尝试过的 xsl 是这个的变体:

  <xsl:template match="w:r[./w:rPr/w:i][not(preceding-sibling::*[w:drawing][1])]">
    <i><xsl:value-of select="."/></i>
  </xsl:template>

还有这个

  <xsl:template match="w:r[./w:rPr/w:i] and not(preceding-sibling::w:r[w:drawing][1])]">
    <i><xsl:value-of select="."/></i>
  </xsl:template>

到目前为止,当我不想要时,我仍然会得到一个模板匹配项。

如果有人想知道我在做什么,我正在将 word 文件转换为 dita/XML 文件。在这种情况下,我试图将 <i> 标签添加到斜体文本中。但是,在我的 word 文档中有一些情况,其中图像位于 table 内以及一些斜体文本,我需要避免匹配这种情况以保留图像。

改变

w:r[./w:rPr/w:i][not(preceding-sibling::*[w:drawing][1])]

w:r[w:rPr/w:i][preceding-sibling::w:r[1][not(w:drawing)]]

为了将 w:r 与斜体 属性 相匹配,这些 w:r 前面没有 w:r 兄弟与 w:drawing child。

完整示例

<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:r>
    <w:drawing/>
  </w:r>
  <w:r w:rsidR="00AE7312">
    <w:rPr>
      <w:i/>
      <w:iCs/>
      <w:w w:val="100"/>
    </w:rPr>
    <w:t>Some italic text 1</w:t>
  </w:r>
  <w:r w:rsidR="00AE7312">
    <w:rPr>
      <w:i/>
      <w:iCs/>
      <w:w w:val="100"/>
    </w:rPr>
    <w:t>Some italic text 2</w:t>
  </w:r>
</w:p>

XSLT

<?xml version="1.0" encoding="UTF-8"?>    
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
           xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
                exclude-result-prefixes="w">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="w:r[w:rPr/w:i][preceding-sibling::w:r[1][not(w:drawing)]]">
    <i><xsl:value-of select="normalize-space()"/></i>
  </xsl:template>

  <xsl:template match="w:p">
    <p><xsl:apply-templates/></p>
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>

XML 输出

<?xml version="1.0" encoding="UTF-8"?>
<p>
   <i>Some italic text 2</i>
</p>