3

私は非常に単純な例を解析しようとしています:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'>
    <openSearch:totalResults>100</openSearch:totalResults>
</root>

私が使用しているスタイルシートは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0" 
                xmlns:app='http://www.w3.org/2007/app' >
<xsl:output method="xml" indent="yes"/>
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
    <results>
        <xsl:attribute name="total-results">
                <xsl:value-of 
                 select="atom:root/openSearch:totalResults"/>
        </xsl:attribute>
    </results>
</xsl:template>
</xsl:stylesheet>

これは libxslt で動作しますが、問題ありません。私は今Javaで同じタスクを実行しようとしています.javax.xml.transformパッケージを使用してこれを実行しようとしています. 予想される結果の代わりに、total-results 属性に空の値が提供されます。ただし、value-of を次のように変更すると、次のようになります。

                <xsl:value-of select="root/totalResults"/>

できます。xml と xslt を変更することはできません。どこかに設定する必要があるパラメータはありますか? コードは非常に簡単です。

InputSource xmlSource = new InputSource( new StringReader(xml) );

DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(xmlSource);

// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();


StreamSource stylesource = new StreamSource(new StringReader(styleSheet));
Transformer transformer = tFactory.newTransformer(stylesource);

StringWriter writer = new StringWriter();

DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(writer);
transformer.transform(source, result);

stringResult = writer.toString();
4

1 に答える 1

5

スタイルシートで、「atom」と「openSearch」の名前空間宣言が欠落しています。以下の作品:

  1. スタイルシートに「openSearch」名前空間 (xml からコピー) を追加します。
  2. この名前空間に関する情報がないため、「atom」名前空間を削除します
  3. ファクトリをネームスペース対応として設定します。factory.setNamespaceAware(true);

Scala の完全なコードは次のとおりです (ファイルから xml とスタイルシートを解析するのが面倒だった、または Java で文字列連結を行うのが面倒でした)。

  def testxsl = {
      val xml = """<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'>
    <openSearch:totalResults>100</openSearch:totalResults>
</root>
      """
      val styleSheet = """<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
        xmlns:app='http://www.w3.org/2007/app' 
        xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'>
<xsl:output method="xml" indent="yes"/>
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
    <results>
        <xsl:attribute name="total-results">
                <xsl:value-of select="root/openSearch:totalResults"/>
        </xsl:attribute>
    </results>
</xsl:template>
</xsl:stylesheet>
        """
    val xmlSource = new InputSource( new StringReader(xml) );
    val factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    val builder = factory.newDocumentBuilder();
    val document = builder.parse(xmlSource);

    // Use a Transformer for output
    val tFactory = TransformerFactory.newInstance();


    val stylesource = new StreamSource(new StringReader(styleSheet));
    val transformer = tFactory.newTransformer(stylesource);

    val writer = new StringWriter();

    val source = new DOMSource(document);
    val result = new StreamResult(writer);
    transformer.transform(source, result);
    writer.toString(); 
  } 
于 2013-02-13T05:36:58.977 に答える