- フィードを「プロキシ」する必要があります
- ほとんどのノードをそのままにしておきます
- いくつかのJavaメソッドを呼び出して、いくつかの既知のノードのコンテンツを変換します
- 変換されたフィードを返します
もちろん、私は避けたいです-フィード全体をメモリにロードする-他のノードを変換する-パフォーマンスが悪い
これは一種のJavaパイプです!
あなたの推薦をありがとう
これは私が使用するものです:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.dom.DOMResult;
import org.w3c.dom.Document;
...
TransformerFactory mTransformFactory = TransformerFactory.newInstance();
cTransformer = mTransformFactory.newTransformer(new StreamSource(new StringReader(StringUtil.readFromResource("/foo.xslt"))));
Document mResultDoc = XmlUtil.createDocument();
Document mResultDoc = XmlUtil.parseXmlFile("foo.xml");
transformer.transform(new DOMSource(source), new DOMResult(mResultDoc));
メモリのオーバーヘッドを回避したいので、DOMSourceとDOMResultの使用法を同等のSAXに置き換える必要があります。StringおよびXMLutilクラスの使用法は、コンテキストから明らかである必要があります。
回答ありがとうございます:これが最終結果です
TransformerFactory tFactory = TransformerFactory.newInstance();
InputStream xslt = FeedSecurityException.class.getResourceAsStream("/filter.xslt");
Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
transformer.transform(new StreamSource(input), new StreamResult(ouput));
そして、ある種のノードに対してjavaメソッドを呼び出し、他のノードはそのままにしておくXSLT
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />
<xsl:template match="CHANGED_NODE">
<xsl:element name="CHANGED_NODE">
<xsl:value-of select="java:com.mypackage.MyClass.tranformContent(.)"/>
</xsl:element>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>