Xslt 如何使用JavaEE从xsl输出读取媒体类型属性?

Xslt 如何使用JavaEE从xsl输出读取媒体类型属性?,xslt,jaxb,xslt-2.0,mime-types,Xslt,Jaxb,Xslt 2.0,Mime Types,我使用XSLT将XML转换为其他内容,在本例中是JSON。我使用标记设置MIME 我使用saxon9将XML转换为JSON Transformer transformer = tFactory.newTransformer(new StreamSource(xslUrl)); ByteArrayInputStream xmlStream = new ByteArrayInputStream(xml.getBytes()); ByteArrayOutputStream baos = new Byt

我使用XSLT将XML转换为其他内容,在本例中是JSON。我使用
标记设置MIME

我使用saxon9将XML转换为JSON

Transformer transformer = tFactory.newTransformer(new StreamSource(xslUrl));
ByteArrayInputStream xmlStream = new ByteArrayInputStream(xml.getBytes());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(baos);
transformer.transform(new StreamSource(xmlStream), new StreamResult(new OutputStreamWriter(dataOut)));
String output = baos.toString();


我怎样才能把MIME理解为“application/json”?

你不一定能理解。例如,如果输出写入文件存储中的文件,则大多数操作系统不允许在文件元数据中捕获媒体类型,因此它将丢失

唯一的例外是将输出写入到确实捕获媒体类型的目标时,例如HTTP响应。在本例中,幸运的是,媒体类型将在HTTP头中找到


当然,ByteArrayOutputStream不会捕获任何有关媒体类型的信息。

您不一定可以。例如,如果输出写入文件存储中的文件,则大多数操作系统不允许在文件元数据中捕获媒体类型,因此它将丢失

唯一的例外是将输出写入到确实捕获媒体类型的目标时,例如HTTP响应。在本例中,幸运的是,媒体类型将在HTTP头中找到


当然,ByteArrayOutputStream不会捕获任何有关媒体类型的信息。

这是从xsl:output媒体类型获取MIME的方法

String mime = transformer.getOutputProperty(OutputKeys.MEDIA_TYPE);

然后您可以相应地操作,在我的例子中,这是为HttpServletResponse设置ContentType。

这是从xsl:output media_类型获取MIME的方法

String mime = transformer.getOutputProperty(OutputKeys.MEDIA_TYPE);

然后,您可以相应地采取行动,在我的例子中,这是为HttpServletResponse设置ContentType。

您希望从样式表的源代码中读取
媒体类型设置吗?或者您想从编译后的样式表中读取它(即使用Saxon的API)?@MartinHonnen我想从使用Saxon的编译后的样式表中读取它。我认为应该允许您从
转换器中读取它,因此您需要按照
((net.sf.Saxon.jaxp.TransformerImpl)转换器的思路进行尝试.GetUnderlinkingXSLTexecutable().GetUnderlinkingCompiledStylesheet().getDeclaredSerializationProperties().getProperty('media-type')
。也许有更简单的方法,Micheal Kay肯定会告诉你。你希望从样式表的源代码中读出
媒体类型设置吗?或者您想从编译后的样式表中读取它(即使用Saxon的API)?@MartinHonnen我想从使用Saxon的编译后的样式表中读取它。我认为应该允许您从
转换器中读取它,因此您需要按照
((net.sf.Saxon.jaxp.TransformerImpl)转换器的思路进行尝试.GetUnderlinkingXSLTexecutable().GetUnderlinkingCompiledStylesheet().getDeclaredSerializationProperties().getProperty('media-type')
。也许有更简单的方法,Micheal Kay肯定会告诉你。如果我使用不同的结果实现(DOMResult、JAXBResult、SAAJResult、SAXResult、StAXResult)而不是StreamResult,我可能会有更好的机会。顺便说一句,我在实现中使用“text/xml”作为默认设置HTTP响应头。由于无法读取transform属性,因此错误地传递了该默认值。因为我通过HTTP发送结果,并且可以在标头中设置响应类型。我从Transformer类中找到了获取xsl:output设置的方法。如果我使用不同的结果实现(DOMResult、JAXBResult、SAAJResult、SAXResult、StAXResult)而不是StreamResult,我可能会有更好的机会。顺便说一句,我在实现中使用“text/xml”作为默认设置HTTP响应头。由于无法读取transform属性,因此错误地传递了该默认值。因为我通过HTTP发送结果,并且可以在标头中设置响应类型。我从Transformer类中找到了获取xsl:output将其设置为什么的方法。