首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过XSLT从xml中删除元素

问通过XSLT从xml中删除元素
EN

Stack Overflow用户
提问于 2016-08-17 23:41:35
回答 1查看 177关注 0票数 1

我刚接触XSLT,所以一直在使用各种网页和论坛,试图从通过SSRS生成的xml文件中剥离元素。

输出如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="xlst_x0020_test" xsi:schemaLocation="xlst_x0020_test http://reportserver?%2Fxlst%20test&amp;rs%3AFormat=XML&amp;rc%3ASchema=True" Name="xlst test">
  <resultset>
    <detail_collection>
      <Detail>
        <title>movie 1</title>
        <year>2000</year>
        <genre>comedy</genre>
      </Detail>
      <Detail>
        <title>movie 2</title>
        <year>2010</year>
        <genre>animation</genre>
      </Detail>
      <Detail>
        <title>movie 3</title>
        <year>1990</year>
        <genre>action</genre>
      </Detail>
    </detail_collection>
  </resultset>
</Report>

我想删除元素"resultset“和"detail_collection”,这样输出就像这样:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="xlst_x0020_test" xsi:schemaLocation="xlst_x0020_test http://reportserver?%2Fxlst%20test&amp;rs%3AFormat=XML&amp;rc%3ASchema=True" Name="xlst test">
    <Detail>
        <title>movie 1</title>
        <year>2000</year>
        <genre>comedy</genre>
    </Detail>
    <Detail>
        <title>movie 2</title>
        <year>2010</year>
        <genre>animation</genre>
    </Detail>
    <Detail>
        <title>movie 3</title>
        <year>1990</year>
        <genre>action</genre>
    </Detail>
</Report>

我在这里按照以下建议创建了以下xslt:

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

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

<xsl:template match="resultset | detail_collection">
    <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

这将导致以下输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Report Name="xlst test" xmlns="xlst_x0020_test">
  <resultset>
    <detail_collection>
      <Detail>
        <title>movie 1</title>
        <year>2000</year>
        <genre>comedy</genre>
      </Detail>
      <Detail>
        <title>movie 2</title>
        <year>2010</year>
        <genre>animation</genre>
      </Detail>
      <Detail>
        <title>movie 3</title>
        <year>1990</year>
        <genre>action</genre>
      </Detail>
    </detail_collection>
  </resultset>
</Report>

我希望是我犯了一个简单的错误,但就是看不到,有人能帮我吗?

另外,有没有人有好的网站、书籍、视频等等,可以从xslt的基础开始呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-17 23:58:04

您所犯的错误是您没有考虑到命名空间。您的Report元素具有默认的名称空间声明

代码语言:javascript
复制
<Report ... xmlns="xlst_x0020_test">

这意味着Report元素及其所有子元素都在一个名称空间中。但是您还没有在XSLT中考虑到这个名称空间。它试图在没有名称空间的情况下匹配resultset和detail_collection,而且它们与名称空间中的元素不同,即使名称本身是相同的。

试试这个XSLT

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

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

<xsl:template match="test:resultset | test:detail_collection">
    <xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>

注XSLT中使用的名称空间前缀无关紧要。它是必须与XML匹配的URI。

在这里阅读名称空间:http://www.xml.com/pub/a/1999/01/namespaces.html和http://www.xml.com/pub/a/2001/04/04/trxml/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39000971

复制
相关文章

相似问题

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