仅当前一个兄弟节点的 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:i
和 w:drawing
的 w: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>
我有一个很像 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:i
和 w:drawing
的 w: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>