2010-10-20 102 views
1

我在w3schools上了解了XSLT和XPath,但它不完全是我想要的。 只有关于转换XSLT 2 HTML的示例,这很简单,但我需要XML 2 XML转换并找不到示例的好教程...我下载了MSXSL.exe,但无法找到使用它来转换XML的示例... 任何人都可以写一个示例吗? 我有customers.xml喜欢:XML 2使用XSLT的XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!--Customers table from Northwind database--> 
<Customers> 
    <Customer CustomerID="ALFKI"> 
    <CompanyName>Alfreds Futterkiste</CompanyName> 
    <Country>Germany</Country> 
    <Orders> 
     <Order OrderID="10643"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10692"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10702"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10835"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="10952"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
     <Order OrderID="11011"> 
     <ShipCity>Berlin</ShipCity> 
     </Order> 
    </Orders> 
    </Customer> 
    <Customer CustomerID="ANATR"> 
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> 
    <Country>Mexico</Country> 
    <Orders> 
     <Order OrderID="10308"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
     <Order OrderID="10625"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
     <Order OrderID="10759"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
     <Order OrderID="10926"> 
     <ShipCity>México D.F.</ShipCity> 
     </Order> 
    </Orders> 
    </Customer> 
</Customers> 

,并试图生成一个只包含“国家”节点.. 怎么写另一个XML?

+0

问得好,+1。看到我的答案两种解决方案。 :) – 2010-10-20 13:25:50

回答

1

这里有两个不同的解决方案:一种简单的和更复杂的一个只产生了独特的国家:

.1。获取所有Country元素:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="*[not(self::Country)]"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 
</xsl:stylesheet> 

当这种转变是在所提供的XML文档应用,通缉,正确的结果产生

<Country>Germany</Country> 
<Country>Mexico</Country> 

0.2。 找到所有独特的国家

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="kCountryByVal" match="Country" use="."/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
     "/*/*/Country[generate-id() 
        = 
        generate-id(key('kCountryByVal',.)[1]) 
        ] 
     "/> 
</xsl:template> 
</xsl:stylesheet> 

当这种转变被应用在任何XML文档与所提供的文件,其中一些Country的元件可以具有相同的值的结构,只有一个Country为每个不同的价值元素生产

随着所提供的XML文档,我们仍然得到同样的结果:

<Country>Germany</Country> 
<Country>Mexico</Country> 
3

完全一样,您只需要相应地使用output元素的method属性。

+1

+1,这里的例子:http://www.w3schools.com/xsl/el_output.asp – Bruno 2010-10-20 12:39:44

3

一些关于这应该工作...

<?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" indent="yes"/> 

    <xsl:template match="/"> 
    <Countries> 
     <xsl:apply-templates select="//Country" mode="copyNode" /> 
    </Countries> 
    </xsl:template> 

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

...下面是结果...

<?xml version="1.0" encoding="utf-8"?> 
<Countries> 
    <Country>Germany</Country> 
    <Country>Mexico</Country> 
</Countries> 
+0

猜猜我不需要微软命名空间,如果我不使用它。 – 2010-10-20 12:43:48

+0

我应该添加这个元素,如果它们存在的话,它将包含''元素的任何子节点。 – 2010-10-20 12:53:07

1

它非常简单,你只需要编写XML而不是HTML在你的xslt模板中。

以下(未经测试)应该让你开始:

<xsl:template match="/"> 
    <Countries> 
    <xsl:apply-templates select="Customers/Customer" /> 
    </Countries> 
</xsl:template> 

<xsl:template match="Customer"> 
    <Country> 
    <xsl:value-of select="Country" /> 
    </Country> 
</xsl:template> 

而且,对于一个XSLT处理器,我衷心推荐的Visual Studio - 它有一个很好的XSLT调试程序,这将帮助你没有尽头了解您的样式表。 (我不知道这功能包含在Express版本...)

0

在拉风,这应该是更短的样式表达这种转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="text()"/> 
    <xsl:template match="@*|/*|Country|Country/text()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

输出:

<Customers> 
    <Country>Germany</Country> 
    <Country>Mexico</Country> 
</Customers>