1

xmlドキュメントと、ドキュメントを別の便利なxmlに変換するためのスタイルシートがあります。参考までに、xmlドキュメントは次のようになります。

<root>
 <element1>value1</element1>
 <element2>value2</element2>
 <element3>value3</element3>
 <element4>..some more levels of data</element4>
</root>

スタイルシートは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="errorResponse.xsl"/>
<xsl:template match="root/element4">
        <xsl:element name="myRoot">
            <xsl:element name="myElement">
                <xsl:apply-templates select="./someElement/someOtherElement"/>
            </xsl:element>
        </xsl:element>
</xsl:template>

私が取得している出力xml文字列は次のようになります:

<?xml version="1.0" encoding="ISO-8859-1"?>
value1
value2
value3
<myRoot><myelement> some data </myElemrnt></myroot>

変換に使用しているコードスニペットは次のとおりです。

InputStream styleSheet = new FileUtil().getFileStream("xsltFileName");
StreamSource xslStream = new StreamSource(styleSheet);

DOMSource in = new DOMSource(inputXMLDoc);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

TransformerFactory transFact = TransformerFactory.newInstance();
transFact.setURIResolver(new XsltURIResolver());
Transformer trans = transFact.newTransformer(xslStream);
trans.transform(in, new StreamResult(baos));
System.out.println(baos.toString()); // displays the above output

ただし、出力は望ましくない形式です。value1、value2、value3は必要ありません。これはまた、生成された新しいXMLを処理するための問題をさらに引き起こしています。

私は変革に関して多くの質問を見てきました。これは長い間私を悩ませています。誰かが私が間違っているところを指摘することができれば、たくさん感謝します。

また、プロセス全体で誤った規則に従っている場合も指摘してください。

ありがとう、よろしく。

4

2 に答える 2

3

テキストノードを出力するDefault Template Ruleにより、その出力が得られます。これらのノードが必要ない場合は、それらを一致させ、何も置き換えない (つまり、空のテンプレート) ことにより、明示的に除外する必要があります。

このテンプレートをスタイルシートに追加してみてください:

<xsl:template match="/">
  <xsl:apply-templates select="root/element4"/>
</xsl:template>

ルートに一致し、 を除くすべてを破棄しますroot/element4

于 2012-08-06T20:06:57.730 に答える
1

ここで起こることは、XSLT組み込みテンプレートが、テンプレートによって明示的に一致しないノードに適用されることです。組み込みテンプレートの最終的な効果は、任意のテキスト ノード (テイルが適用される) を出力にコピーすることです。

この不要な出力を抑制する最も簡単で最短の方法の 1 つは、次のテンプレートを追加することです。

<xsl:template match="text()"/>

これにより、このテンプレートが実行用に選択されているテキストノードが出力にコピーされなくなります。

于 2012-08-07T04:36:38.417 に答える