0

我使用Saxon HE 9.2进行了一些 XSLT 转换,随后输出由Castor 1.3.1解组。整个事情在JDK 6上使用 Java 运行。

我的 XSLT 转换如下所示:

<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 解组器,它是管道中的下一个,它将转换的输出解组为 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();

我将不胜感激任何指向解决方案方向的提示。:-) 如果有任何不清楚的地方,我很乐意提供更多细节。

4

3 回答 3

2

就 XML 而言<x /><x></x>它们是一回事。

请参阅有关此的XML 1.0规范。

检查您的架构以确保<ns:property/>它对其有效。

于 2010-03-14T20:47:01.327 回答
1

尝试将输出方法设置为 xhtml 而不是 xml。Saxon 将使用 XHTML 序列化程序来呈现开始和结束标记。

我不相信它会在输出中添加任何与 XHTML 相关的额外内容,除非您添加额外的输出参数。XSLT 2.0 规范中有专门用于 XHTML 序列化的部分供参考。我不确定撒克逊人在这方面的符合程度。

于 2010-03-15T02:57:36.050 回答
1

如果您只是想快速尝试,如果独立标签确实导致了问题,您可以在<ns:property/>(using <xsl:comment>) 的内容中插入一个(空)注释 - 并且可能稍后将其过滤掉。

于 2010-03-14T21:41:21.217 回答