gpt4 book ai didi

java xsl 转换副本删除 namespace 前缀

转载 作者:行者123 更新时间:2023-12-01 12:33:39 26 4
gpt4 key购买 nike

我做了一个最小的例子来重现这个问题。这是转换(mini.xsl):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<foo>
<xsl:copy-of select="."/>
</foo>
</xsl:template>
</xsl:stylesheet>

这是输入(mini.xml):

<?xml version="1.0" encoding="utf-8"?>
<bar xmlns:x="baz">
<x:baz/>
</bar>

当我应用转换时

xsltproc mini.xsl mini.xml

结果看起来符合预期:

<?xml version="1.0"?>
<foo>
<bar xmlns:x="baz">
<x:baz/>
</bar>
</foo>

但是,当我使用以下 Java 程序运行转换时,

import java.io.FileInputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Program
{
public static void main(String[] args)
{
try
{
Source transform = new StreamSource(new FileInputStream(args[0]));

Templates templates = TransformerFactory.newInstance().newTemplates(transform);

Document input = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(args[1]));

Result result = new StreamResult(System.out);

templates.newTransformer().transform(new DOMSource(input), result);
}
catch (TransformerFactoryConfigurationError | ParserConfigurationException | SAXException | IOException | TransformerException e)
{
e.printStackTrace();
}
}
}

结果如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar xmlns:x="baz">
<baz/>
</bar>
</foo>

(请注意,baz 前面的 x: 前缀丢失了。)

这是为什么?

我能做些什么(保留命名空间前缀)?

最佳答案

由于我只能假设是历史原因,DocumentBuilderFactory 默认情况下非命名空间感知。在执行 newDocumentBuilder() 之前,您需要显式打开命名空间。

最好使用直接采用 Fileparse 方法,而不是创建自己的 FileInputStream (您的代码是解析完成后不会关闭),并且与构建 TransformerStreamSource 类似。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document input = dbf.newDocumentBuilder().parse(new File(args[1]));

关于java xsl 转换副本删除 namespace 前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com