我使用 Saxon HE 9.2 进行一些XSLT转换,输出稍后由 Castor 1.3.1 解组。整个事情在 JDK 6
上运行Java。我的XSLT-Transformation看起来像这样:
<xsl:transform
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://my/own/custom/namespace/for/the/target/document">
<xsl:output method="xml" encoding="UTF-8" indent="no" />
<xsl:template match="/">
<ns:item>
<ns:property name="id">
<xsl:value-of select="/some/complicated/xpath" />
</ns:property>
<!-- ... more ... -->
</ns:item>
</xsl:template>
所以问题是:如果XPath表达式/some/complicated/xpath
求值为空序列,则Saxon序列化程序会写<ns:property/>
而不是<ns:property></ns:property>
。但是,这会混淆Castor unmarshaller,它是管道中的下一个,它将转换的输出解组为XSD生成的Java类的实例。
所以我的问题是:如何告诉Saxon-serializer输出空标签而不是独立标签?
以下是我目前正在执行的转换:
import net.sf.saxon.s9api.*;
import javax.xml.transform.*;
import javax.xml.transform.sax.SAXSource;
// ...
// read data
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
// ... there is some more setting up the xmlReader here ...
InputStream xsltStream = new FileInputStream(xsltFile);
InputStream inputStream = new FileInputStream(inputFile);
Source xsltSource = new SAXSource(xmlReader, new InputSource(xsltStream));
Source inputSource = new SAXSource(xmlReader, new InputSource(inputStream));
XdmNode input = processor.newDocumentBuilder().build(inputSource);
// initialize transformation configuration
Processor processor = new Processor(false);
XsltCompiler compiler = processor.newXsltCompiler();
compiler.setErrorListener(this);
XsltExecutable executable = compiler.compile(xsltSource);
Serializer serializer = new Serializer();
serializer.setOutputProperty(Serializer.Property.METHOD, "xml");
serializer.setOutputProperty(Serializer.Property.INDENT, "no");
serializer.setOutputStream(output);
// execute transformation
XsltTransformer transformer = executable.load();
transformer.setInitialContextNode(input);
transformer.setErrorListener(this);
transformer.setDestination(serializer);
transformer.setSchemaValidationMode(ValidationMode.STRIP);
transformer.transform();
我很欣赏任何指向解决方案的提示。 :-)如果有任何不明确之处,我很乐意提供更多细节。
答案 0 :(得分:2)
答案 1 :(得分:1)
如果您只想快速尝试,如果独立标签确实导致问题,您可以在<ns:property/>
的内容中插入(空)评论(使用<xsl:comment>
) - 并且可能会过滤以后出去。
答案 2 :(得分:1)
尝试将输出方法设置为xhtml而不是xml。 Saxon将使用XHTML序列化程序,它将呈现开始和结束标记。
除非添加额外的输出参数,否则我不相信它会向输出中添加任何与XHTML相关的附加内容。有一个section in the XSLT 2.0 spec专门用于XHTML序列化以供参考。我不确定撒克逊人在这个领域的紧密程度。