如何使用 XSLT 2.0 基于字符串中的整数检索节点



这是我的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

  1. 我想拆分属性值Heading1以在标题之后检索字符串。所以,现在我们得到了1.之后,在读取下一个w:p时,应用相同的逻辑来拆分当前属性值。所以,在这种情况下,我们有 2 .现在,我想将此当前值2与以前的值1进行比较。
  2. 如果小于上一个值,则仅选择当前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>

最新更新