我是XSLT的新手,因此一直在使用各种网页和论坛,试图从通过SSRS生成的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&rs%3AFormat=XML&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”,所以输出如下所示:
<?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&rs%3AFormat=XML&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 :(得分:2)
您犯的错误是您没有考虑名称空间。您的Report
元素具有默认名称空间声明
<Report ... xmlns="xlst_x0020_test">
这意味着Report
元素及其所有后代都在命名空间中。但是你没有在XSLT中考虑这个命名空间。它试图在没有命名空间的情况下匹配resultset
和detail_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.html和http://www.xml.com/pub/a/2001/04/04/trxml/