通过XSLT从xml中删除元素

问题描述:

我是XSLT的新手,因此一直在使用各种网页和论坛来尝试去除通过SSRS生成的xml文件中的元素。通过XSLT从xml中删除元素

输出看起来是这样的:

<?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> 

我想删除的元素“结果集”和“detail_collection”这样的输出是这样的:

<?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请遵循以下建议:

<?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> 

其中导致以下输出:

<?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的基础知识?

+0

Powershell的可以去通过一个XML文件,并拔出你需要什么也。可能值得一看,除非你绝对需要使用XSLT来完成。 –

你犯的错误是你没有考虑名称空间。您Report元素有一个默认命名空间声明

<Report ... xmlns="xlst_x0020_test"> 

这意味着Report元素,它的所有后代,是在一个命名空间。但是你没有在XSLT中考虑这个命名空间。它试图在没有命名空间中匹配resultsetdetail_collection,并且这些与名称空间中的元素不同,即使名称本身是相同的。

试试这个XSLT

<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.htmlhttp://www.xml.com/pub/a/2001/04/04/trxml/