2

私は奇妙な問題を抱えており、解決策が見つからないようです。XSLT スタイルシートを XML ファイルに適用しようとしているだけです (この場合、SPARQL クエリの結果は XML としてフォーマットされますが、他の XML ファイルでも同じ結果が得られます)。この場合、既に読み込まれている XML ドキュメントを DOMSource 経由で再利用して、トランスフォーマーを作成する必要があります。以下のコードを見つけることができます (単純化されています。通常、スタイルシート ドキュメントは別の場所から取得されます)。

TransformerFactory factory = TransformerFactory.newInstance();
Document stylesheet = db.parse(new File("C:/workspace_5/stylesheet.xml"));
Transformer xformer = factory.newTransformer(new DOMSource(stylesheet));

Source source = new StreamSource(new FileInputStream("C:/workspace_5/xml-file.xml"));        
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
Result result = new StreamResult(bOut);

xformer.transform(source, result);

変換された XML の代わりに、StreamResult の出力ストリームは読み込まれたスタイルシートを返します。2行目と3行目を次のように置き換えると:

Transformer xformer = factory.newTransformer(new StreamSource(
    new FileInputStream(""C:/workspace_5/stylesheet.xml")));

その後、すべてがうまく機能します。もちろん、読み込んだスタイルシート ドキュメントを文字列にシリアル化し、それを ByteArrayInputStream に変換し (さらに悪い場合は、ファイルに書き込み)、それを使用して StreamSource を作成することもできますが、それはばかげています。

これが機能しない理由はありますか?

xml-file.xml コード:

<?xml version="1.0"?>
<sparql>
  <head>
    <variable name="buyerName"/>
  </head>
  <results>
    <result>
      <binding name="buyerName">
        <literal>John Doe</literal>
      </binding>
    </result>
  </results>
</sparql>

stylesheet.xml コード:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:po="http://www.w3.org/2002/ws/sawsdl/spec/wsdl/order#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<xsl:template match="/sparql">
    <xsl:for-each select="results/result">

        <buyer xsi:type="po:Buyer">
            <name xsi:type="string"><xsl:value-of select="binding[@name='buyerName']/literal" /></name>
        </buyer>

    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

ありがとう!

ウィリアム

4

1 に答える 1

2

あなたの DocumentBuilderFactory はおそらく名前空間を認識していません。次の方法で名前空間の認識を有効にしてみてください。

factory.setNamespaceAware(true);

関連するコードについては、この投稿をチェックしてください。

于 2012-11-20T08:21:06.980 に答える