我正在编写一个XSL转换。我想编写一个模板,该模板匹配文档的所有子元素,除了一个特定节点。我的xml看起来像这样 -
<Document>
<NodeA></NodeA>
<NodeB></NodeB>
<ServiceNode></ServiceNode>
<NodeX></NodeX>
</Document>
我想编写一个模板,该模板匹配除ServiceNode
之外的所有节点,即NodeA
到NodeX
。如何编写此Xpath来获取 -
<xsl:template match="ALL Nodex Except ServiceNode">
答案 0 :(得分:29)
我想写一个模板 匹配除ServiceNode之外的所有节点 即NodeA到NodeX。
如果“node”表示元素,请使用:
<xsl:template match="*[not(self::ServiceNode)]">
如果“节点”是指任何节点(类型为元素,文本,注释,处理指令):使用
<xsl:template match="node()[not(self::ServiceNode)]">
如果您只想匹配Document
的孩子,请使用:
<xsl:template match="Document/node()[not(self::ServiceNode)]">
如果您只想匹配top元素的子元素,请使用:
<xsl:template match="/*/node()[not(self::ServiceNode)]">
答案 1 :(得分:4)
你应该更好地使用这个表达式:
*[not(self::ServiceNode)]
包含在XSLT中:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:apply-templates select="*[not(self::ServiceNode)]"/>
</xsl:template>
<xsl:template match="*">
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
使用此XML示例:
<Document>
<NodeA>1</NodeA>
<NodeB>2</NodeB>
<ServiceNode>3</ServiceNode>
<NodeX>4</NodeX>
</Document>
它会给出正确的结果:
1
2
4
答案 2 :(得分:2)
<xsl:template match="Document/*[name() != 'ServiceNode']">
(或local-name()
如果你必须处理命名空间)
答案 3 :(得分:1)
您可以使用两个模板:
<xsl:template match="Document/*">
...do something...
</xsl:template>
<xsl:template match="Document/ServiceNode" />
后面的模板将具有优先权,因此第一个模板将匹配除ServiceNode之外的所有内容。
答案 4 :(得分:0)
/Document/*[not(name()='ServiceNode')]