Xml 匹配附近的父元素

Xml 匹配附近的父元素,xml,xslt,Xml,Xslt,我正在尝试匹配特定节点附近的一些父元素。 所以基本上 查找包含TESTWORD的所有节点 匹配前1个父节点和后3个父节点 替换为另一个节点 输入: <!-- ... --> <w:p> <w:pPr> Text ... </w:pPr> <w:r> <w:rPr/> <w:t xml:space="preser

我正在尝试匹配特定节点附近的一些父元素。
所以基本上

  • 查找包含TESTWORD的所有节点
  • 匹配前1个父节点和后3个父节点
  • 替换为另一个节点
  • 输入:

    <!-- ... -->
      <w:p>
          <w:pPr>
              Text ...
          </w:pPr>
          <w:r>
              <w:rPr/>
              <w:t xml:space="preserve">More text...</w:t>
          </w:r>
          
    
          <!-- REMOVE FROM HERE -->
          <w:r>
              <w:rPr/>
              <w:fldChar w:fldCharType="begin"/>
          </w:r>
          <w:r>
              <w:rPr/>
              <w:instrText> TESTWORD </w:instrText>
          </w:r>
          <w:r>
              <w:rPr/>
              <w:fldChar w:fldCharType="separate"/>
          </w:r>
          <w:r>
              <w:rPr/>
              <w:t>Even more text...</w:t>
          </w:r>
          <w:r>
              <w:rPr/>
              <w:fldChar w:fldCharType="end"/>
          </w:r>
          <!-- REMOVE UNTIL HERE -->
    
      </w:p>
    <!-- ... -->
    
    <!-- ... -->
      <w:p>
          <w:pPr>
              Text ...
          </w:pPr>
          <w:r>
              <w:rPr/>
              <w:t xml:space="preserve">More text...</w:t>
          </w:r>
    
            <!-- INSERT NEW ELEMENTS FROM HERE -->
            <w:r>
                <w:rPr></w:rPr>
                <w:t>New text</w:t>
            </w:r>
           <!-- INSERT NEW ELEMENTS UNTIL HERE -->
    
      </w:p>
    <!-- ... -->
    
    • 匹配表达式中的
      祖先::
      之前缺少一个
      /
      。但是,不能在匹配表达式中使用
      祖先::
    • 您尚未在XSLT中声明
      w
      namespace前缀。这看起来像Word标记,因此假设它是
      xmlns:w=”http://schemas.openxmlformats.org/wordprocessingml/2006/main“
      但如果不正确则更新
    • 字符串文字值需要引用参数值
    我会这样做:

    <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
        xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
        <xsl:output indent="yes" method="xml" encoding="utf-8" />
        
        <xsl:param name="newText" select="'New Text'" />
        <xsl:param name="oldText" select="' TESTWORD '" />
        
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*" />
            </xsl:copy>
        </xsl:template>
        
        <xsl:template match="*/*[.=' TESTWORD ']">
            <xsl:element name="w:rPr"></xsl:element>
            <xsl:element name="w:t">
                <xsl:value-of select="$newText" />
            </xsl:element>  
        </xsl:template>
        
        <xsl:template match="*[following-sibling::*[1]/*[.=$oldText] | preceding-sibling::*[position() lt 4]/*[.=$oldText]]"/>
        
    </xsl:stylesheet>
    

    语法
    *[.='TESTWORD']祖先::*
    没有意义,您可以在XPath中编写
    *[.='TESTWORD']/祖先::*
    但这不是合法的XSLT模式,它可以是
    *[./*[.='TESTWORD']
    'ancestor', '::', '*'
    
    <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
        xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
        <xsl:output indent="yes" method="xml" encoding="utf-8" />
        
        <xsl:param name="newText" select="'New Text'" />
        <xsl:param name="oldText" select="' TESTWORD '" />
        
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*" />
            </xsl:copy>
        </xsl:template>
        
        <xsl:template match="*/*[.=' TESTWORD ']">
            <xsl:element name="w:rPr"></xsl:element>
            <xsl:element name="w:t">
                <xsl:value-of select="$newText" />
            </xsl:element>  
        </xsl:template>
        
        <xsl:template match="*[following-sibling::*[1]/*[.=$oldText] | preceding-sibling::*[position() lt 4]/*[.=$oldText]]"/>
        
    </xsl:stylesheet>