我有一个关于理解模板中前后兄弟姐妹的基本问题。
我有以下 XML 源:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>A</a>
<b>B</b>
<c>C</c>
<d>D</d>
<e>E</e>
<more>FGHIJ</more>
</root>
我想复制除<c>
后同一级别上的节点以外的所有内容。这应该以通用的方式完成。 所以我写了这个 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[following-sibling::c]">
<xsl:copy>
<xsl:text>modified</xsl:text>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
有人请解释为什么在这种情况下<xsl:template match="*[following-sibling::c]">
匹配<c>
之前的所有内容以及如何以正确的方式做到这一点?正如我所期望的那样,它在<c>
之后会匹配所有内容,但不明白为什么。 多谢!
您的 match 语句*[following-sibling::c]
匹配每个元素<c>
,该元素按文档顺序排列在它后面(这些元素共享一个父元素(。 但是,标识转换仍将包括后面的转换<c>
鉴于此,请尝试删除第二个模板并添加以下内容:
<xsl:template match="*[preceding-sibling::c]"/>
这将在<c>
之后抑制这些元素。在这种情况下,抑制您不需要的元素通常比尝试包含其他元素更容易。
match="*"
匹配任何元素,match="*[following-sibling::c]"
匹配方括号中谓词中的条件成立的任何元素,即具有以下同级元素的任何元素,即c
元素。