首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT/XPath :从所选内容中排除节点

XSLT/XPath :从所选内容中排除节点
EN

Stack Overflow用户
提问于 2012-03-27 09:36:30
回答 2查看 492关注 0票数 1

我希望选择满足特定条件的节点列表,在处理这些节点之后,我希望选择其余的节点。我如何在XSLT和XPath中做到这一点。

下面是一个场景,我有这个xml

代码语言:javascript
复制
<books>
<book name="Basic XML">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="Basic XML">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Basic XSLT">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="Basic XSLT">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Basic Java">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="Basic Java">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Web Service">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="C Programming">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
</books>

  1. 选择<type>为“<book>”的所有教程节点,下面是输出

代码语言:javascript
复制
<books>
<book name="Basic XML">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>   
<book name="Basic XSLT">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Basic Java">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
</books>

然后,

  1. 选择其他<book>节点,这些节点的<type>不是"Tutorial“,并且与在#1中选择的节点的@name不同,输出仅为:

代码语言:javascript
复制
<books>
<book name="Web Service">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="C Programming">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
</books>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-27 09:46:47

对于第一个查询:

代码语言:javascript
复制
<xsl:apply-templates select="/books/book[type='Tutorial']"/>

对于第二个查询:

代码语言:javascript
复制
<xsl:apply-templates select="/books/book[type!='Tutorial']"/>

然后,您将需要适当的模板来处理它们:

代码语言:javascript
复制
<xsl:template match="/books/book[type='Tutorial']">
   Do Something...
</xsl:template>

最后一步是检查当前节点是否也有教程节点

代码语言:javascript
复制
<xsl:template match="/books/book[type!='Tutorial']">
   <xsl:variable name="bookname">
      <xsl:value-of select="@name"/>
   </xsl:variable>
   <xsl:if test="count('/books/book[@name=$bookname and type='Tutorial']')=0">
      Do Something...
   </xsl:if>
</xsl:template>
票数 1
EN

Stack Overflow用户

发布于 2012-03-27 11:40:32

这里的是一个完整的解决方案

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <xsl:variable name="vTutBooks" select="book[type = 'Tutorial']"/>
  <books>
   <xsl:apply-templates select="$vTutBooks"/>
  </books>

  <books>
   <xsl:apply-templates select=
   "book[not(type = 'Tutorial')
       and
         not(@name = $vTutBooks/@name)
        ]"/>
  </books>
 </xsl:template>
</xsl:stylesheet>

在所提供的XML文档上应用此转换时为

代码语言:javascript
复制
<books>
    <book name="Basic XML">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic XML">
        <type>Tutorial</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic XSLT">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic XSLT">
        <type>Tutorial</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic Java">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic Java">
        <type>Tutorial</type>
        <grouping>A</grouping>
    </book>
    <book name="Web Service">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="C Programming">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
</books>

生成所需的正确结果

代码语言:javascript
复制
<books>
   <book name="Basic XML">
      <type>Tutorial</type>
      <grouping>A</grouping>
   </book>
   <book name="Basic XSLT">
      <type>Tutorial</type>
      <grouping>A</grouping>
   </book>
   <book name="Basic Java">
      <type>Tutorial</type>
      <grouping>A</grouping>
   </book>
</books>
<books>
   <book name="Web Service">
      <type>Educational</type>
      <grouping>A</grouping>
   </book>
   <book name="C Programming">
      <type>Educational</type>
      <grouping>A</grouping>
   </book>
</books>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9882239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档