XSLT 模板匹配中的以下同级如何工作?

  • 本文关键字:何工作 工作 XSLT xml xslt
  • 更新时间 :
  • 英文 :


我有一个关于理解模板中前后兄弟姐妹的基本问题。

我有以下 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元素。

最新更新