I am writing an XSL transformation. I want to write a template which matches all the child elements of the document except one particular node. My xml looks like this -
我正在编写XSL转换。我想要编写一个模板,该模板匹配文档的所有子元素,除了一个特定的节点。我的xml是这样的
<Document>
<NodeA></NodeA>
<NodeB></NodeB>
<ServiceNode></ServiceNode>
<NodeX></NodeX>
</Document>
I want to write a template that matches all nodes except ServiceNode
i.e. NodeA
to NodeX
. How to write this Xpath to get -
我想写一个模板来匹配除了ServiceNode (NodeA到NodeX)之外的所有节点。如何编写这个Xpath来获取-
<xsl:template match="ALL Nodex Except ServiceNode">
5 个解决方案
#1
26
I want to write a template that matches all nodes except ServiceNode i.e. NodeA to NodeX.
我想写一个模板来匹配除了ServiceNode (NodeA到NodeX)之外的所有节点。
If by "node" you mean element, then use:
如果您指的是“节点”,则使用:
<xsl:template match="*[not(self::ServiceNode)]">
If by "node" you mean any node (of type element, text, comment, processing-instruction): use
如果“node”指的是任何节点(类型元素、文本、注释、处理指令):use
<xsl:template match="node()[not(self::ServiceNode)]">
If you want only children of Document
to be matched use:
如果您希望文件的子文件匹配使用:
<xsl:template match="Document/node()[not(self::ServiceNode)]">
If you want only children of the top element to be matched use:
如果您想要顶部元素的子元素进行匹配,请使用:
<xsl:template match="/*/node()[not(self::ServiceNode)]">
#2
4
You should better use this expression:
你最好用这个表达:
*[not(self::ServiceNode)]
As incorporated in an XSLT:
如在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>
With this XML sample:
这个XML示例:
<Document>
<NodeA>1</NodeA>
<NodeB>2</NodeB>
<ServiceNode>3</ServiceNode>
<NodeX>4</NodeX>
</Document>
It will give a correct result:
它将给出正确的结果:
1
2
4
#3
2
<xsl:template match="Document/*[name() != 'ServiceNode']">
(or local-name()
if you have to deal with namespaces)
(或本地名称(),如果您必须处理名称空间)
#4
1
You could use two templates:
您可以使用两个模板:
<xsl:template match="Document/*">
...do something...
</xsl:template>
<xsl:template match="Document/ServiceNode" />
The later template will take priority, so the first template will match everything except ServiceNode.
后面的模板将具有优先级,因此第一个模板将匹配除ServiceNode之外的所有内容。
#5
0
/Document/*[not(name()='ServiceNode')]
#1
26
I want to write a template that matches all nodes except ServiceNode i.e. NodeA to NodeX.
我想写一个模板来匹配除了ServiceNode (NodeA到NodeX)之外的所有节点。
If by "node" you mean element, then use:
如果您指的是“节点”,则使用:
<xsl:template match="*[not(self::ServiceNode)]">
If by "node" you mean any node (of type element, text, comment, processing-instruction): use
如果“node”指的是任何节点(类型元素、文本、注释、处理指令):use
<xsl:template match="node()[not(self::ServiceNode)]">
If you want only children of Document
to be matched use:
如果您希望文件的子文件匹配使用:
<xsl:template match="Document/node()[not(self::ServiceNode)]">
If you want only children of the top element to be matched use:
如果您想要顶部元素的子元素进行匹配,请使用:
<xsl:template match="/*/node()[not(self::ServiceNode)]">
#2
4
You should better use this expression:
你最好用这个表达:
*[not(self::ServiceNode)]
As incorporated in an XSLT:
如在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>
With this XML sample:
这个XML示例:
<Document>
<NodeA>1</NodeA>
<NodeB>2</NodeB>
<ServiceNode>3</ServiceNode>
<NodeX>4</NodeX>
</Document>
It will give a correct result:
它将给出正确的结果:
1
2
4
#3
2
<xsl:template match="Document/*[name() != 'ServiceNode']">
(or local-name()
if you have to deal with namespaces)
(或本地名称(),如果您必须处理名称空间)
#4
1
You could use two templates:
您可以使用两个模板:
<xsl:template match="Document/*">
...do something...
</xsl:template>
<xsl:template match="Document/ServiceNode" />
The later template will take priority, so the first template will match everything except ServiceNode.
后面的模板将具有优先级,因此第一个模板将匹配除ServiceNode之外的所有内容。
#5
0
/Document/*[not(name()='ServiceNode')]