这是我的XML文档:
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1" />
</w:ppr>
<w:r>
<w:t>Para1</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading2" />
</w:ppr>
<w:r>
<w:t>Para2</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading3" />
</w:ppr>
<w:r>
<w:t>Para3</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading4" />
</w:ppr>
<w:r>
<w:t>Para4</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1" />
</w:ppr>
<w:r>
<w:t>Para5</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading3" />
</w:ppr>
<w:r>
<w:t>Para6</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading4" />
</w:ppr>
<w:r>
<w:t>Para7</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading2" />
</w:ppr>
<w:r>
<w:t>Para8</w:t>
</w:r>
</w:p>
<!-- This is my Current Node -->
<w:p>
<w:ppr>
<w:pstyle w:val="Heading3" />
</w:ppr>
<w:r>
<w:t>Para9</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1" />
</w:ppr>
<w:r>
<w:t>Para10</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
因此,在读取每个元素时,我想检查w:ppr/w:pstyle
的属性w:val
。例如,在上面的文件中,第一个w:p
包含该 ( w:ppr/w:pstyle/@w:val
( 属性值作为Heading1
。所以,对于第一个w:p
,我什么都不在乎,只是接受它。之后,采取这个w:p
:
- 我想拆分属性值
Heading1
以在标题之后检索字符串。所以,现在我们得到了1
.之后,在读取下一个w:p
时,应用相同的逻辑来拆分当前属性值。所以,在这种情况下,我们有2
.现在,我想将此当前值2
与以前的值1
进行比较。 - 如果小于上一个值,则仅选择当前
w:p
。否则,不要做任何事情。
对所有w:p
节点应用上述步骤 1 和 2。因此,就我而言,我只想选择以下w:p
节点。
示例输出节点是(完全获取整个 w:p 节点(:
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1" />
</w:ppr>
<w:r>
<w:t>Para1</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1" />
</w:ppr>
<w:r>
<w:t>Para5</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading2" />
</w:ppr>
<w:r>
<w:t>Para8</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1" />
</w:ppr>
<w:r>
<w:t>Para10</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
我相信你的意思是,当相关的 w:val 属性大于前一个 w:p 的 w:val 元素(如果存在(时,您希望忽略 w:p 节点。
用XPath术语来说,其中...
number(substring-after(w:ppr/w:pstyle/@w:val, 'Heading'))
>= number(substring-after(preceding-sibling::w:p[1]/w:ppr/w:pstyle/@w:val, 'Heading'))
下面是完整的 XSLT,这是标识转换,带有额外的情况来匹配此类 w:p 节点并忽略它们:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="w:p
[
preceding-sibling::w:p[1]
and
number(substring-after(w:ppr/w:pstyle/@w:val, 'Heading'))
>= number(substring-after(preceding-sibling::w:p[1]/w:ppr/w:pstyle/@w:val, 'Heading'))
]">
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="comment()" />
</xsl:stylesheet>
应用于输入示例时,将生成以下输出:
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1"/>
</w:ppr>
<w:r>
<w:t>Para1</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1"/>
</w:ppr>
<w:r>
<w:t>Para5</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading2"/>
</w:ppr>
<w:r>
<w:t>Para8</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1"/>
</w:ppr>
<w:r>
<w:t>Para10</w:t>
</w:r>
</w:p>
</w:body>
</w:document>