gpt4 book ai didi

java - 撒克逊 XSLT 转换 : How to change serialization of an empty tag from to ?

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

我使用 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 序列化器输出空标签而不是独立标签?

以下是我目前正在执行的转换操作:

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();

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

最佳答案

就 XML 而言 <x /><x></x>是同一个东西。

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

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

关于java - 撒克逊 XSLT 转换 : How to change serialization of an empty tag from <x/> to <x></x>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443704/

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