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

时间:2018-06-06 21:57:33

标签: xml xslt xpath ms-word openxml

我有一个特别的问题很像this one,但在我的情况下,如果任何前面的兄弟的孩子不包含某个节点,我想只有一个匹配。

在我的情况下,我从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:r'sw:i的{​​{1}}。 我到目前为止尝试的xsl是这个的变种:

w:drawing

和这个

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

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

如果有人想知道我在做什么,我正在将word文件转换为dita / XML文件。在这种情况下,我尝试将 <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文档中有一些实例,其中图像在一个表格内以及一些斜体文本,我需要避免匹配这种情况以保留图像。

1 个答案:

答案 0 :(得分:1)

更改

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:drawing孩子之前的紧接。

完整示例

<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 Out

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