XSLT:如何过滤掉具有特定命名空间的所有元素

时间:2013-02-03 09:04:16

标签: java xslt xpath

=========更新=========

非常感谢Tomalak提供正确的XSL语法,感谢Ian Roberts指出为了在我的XSLT中使用命名空间,我需要在我的DocumentBuilderFactory中最初调用“setNamespaceAware(true)”。 / p>

========= END UPDATE =========

问:如何编写一个过滤掉“http://foo.com/abc”命名空间中所有元素和/或所有节点树的XSLT样式表?

我有一个如下所示的XML文件:

SOURCE XML:

<zoo xmlns="http://myurl.com/wsdl/myservice">
  <animal>elephant</animal>
  <exhibit>
    <animal>walrus</animal>
    <animal>sea otter</animal>
    <trainer xmlns="http://foo.com/abc">Jack</trainer>
  </exhibit>
  <exhibit xmlns="http://foo.com/abc">
    <animal>lion</animal>
    <animal>tiger</animal>
  </exhibit>
</zoo>

渴望结果XML:

<zoo xmlns="http://myurl.com/wsdl/myservice">
  <animal>elephant</animal>
  <exhibit>
    <animal>walrus</animal>
    <animal>sea otter</animal>
  </exhibit>
</zoo>

XSLT(感谢Tomalak):

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:a="http://foo.com/abc"
    exclude-result-prefixes="a"
>
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="a:* | @a:*" />
</xsl:stylesheet>

提前谢谢!

JAVA程序成功完成了由NAMESPACE进行的XSLT过滤:

import java.io.*;
import org.w3c.dom.*; // XML DOM
import javax.xml.parsers.*; // DocumentBuilder, etc
import javax.xml.transform.*; // Transformer, etc
import javax.xml.transform.stream.*; // StreamResult, StreamSource, etc
import javax.xml.transform.dom.DOMSource;

public class Test {

    public static void main(String[] args) {
        new Test().testZoo();
    }

public void testZoo () {
    String zooXml = Test.readXmlFile ("zoo.xml");
    if (zooXml == null)
        return;

    try {
        // Create a new document builder factory, and make sure it[s namespace-aware 
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder docBuilder = dbf.newDocumentBuilder ();

        // Read XFDD input string into DOM
        Document xfddDoc = 
            docBuilder.parse(new StringBufferInputStream (zooXml));

        // Filter out all elements in "http://foo.com/abc" namespace
        StreamSource styleSource = new StreamSource (new File ("zoo.xsl"));
        Transformer transformer =
            TransformerFactory.newInstance().newTransformer (styleSource);

        // Convert final DOM back to String
        StringWriter buffer = new StringWriter ();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,  "yes"); // Remember: we want to insert this XML as a subnode
        transformer.setOutputProperty(OutputKeys.INDENT,  "yes");
        transformer.transform(new DOMSource(xfddDoc), new StreamResult (buffer));
        String translatedXml = buffer.toString();
    }
    catch (Exception e) {
        System.out.println ("convertTransactionData error: " + e.getMessage());
        e.printStackTrace ();
    }
}

1 个答案:

答案 0 :(得分:6)

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:a="http://foo.com/abc"
    exclude-result-prefixes="a"
>
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="a:* | @a:*" />
</xsl:stylesheet>

空模板匹配节点但不输出​​任何内容,有效地删除它们匹配的内容。

相关问题