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
所以基本上
<!-- ... -->
<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中声明
namespace前缀。这看起来像Word标记,因此假设它是w
但如果不正确则更新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>