3

いくつかの XML フォーマットから 1 つの標準への変換を行いました。私の XSL は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="list | store">
        <list>
            <xsl:for-each select="item | product | product-store">
            <item>
                <name>
                    <xsl:choose>
                        <xsl:when test="name"><xsl:value-of select="substring-before(name, ' ')" /></xsl:when>
                        <xsl:otherwise><xsl:value-of select="name | title" /></xsl:otherwise>
                    </xsl:choose>
                </name>
                <desc>
                    <xsl:choose>
                        <xsl:when test="name"><xsl:value-of select="substring-after(name, ' ')" /></xsl:when>
                        <xsl:otherwise><xsl:value-of select="desc" /></xsl:otherwise>
                    </xsl:choose>
                </desc>
                <nr><xsl:value-of select="index | number" /></nr>
            </item>
            </xsl:for-each>
        </list>
    </xsl:template>
</xsl:stylesheet>

私の例のXMLは

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<list>
    <item>
      <index>1362242627</index>
      <name>test 22</name>  
    </item>
    <item>
      <index>2362625609</index>
      <name>test 4</name>  
    </item>
    <item>
      <index>736274650</index>
      <name>test 76</name>  
    </item>
</list>

Firefox 17、IE9、Google Chrome などのブラウザで正しく表示されないのはなぜですか? 通常のテキストのように表示されますが、戻り値の型は "text/xml" です。Opera でのみ正しく動作します。

4

2 に答える 2

6

問題は、「正しい」表示とは何かを判断することだと思います。FirefoxやIEのようなブラウザはxml-stylesheet、タイプの処理命令を含むXMLドキュメントをtext/xslブラウザウィンドウにロードしたら、XMLを、HTMLや最近の(X)HTMLとSVG(またはプラスMathML)。ただし、スタイルシートはXML入力を受け取り、それをブラウザに認識されないXML結果形式に変換するため、結果ツリーのテキストノードのコンテンツをレンダリングするだけです。OperaはXML入力をXML結果に変換しているようですが、結果の形式が不明であると認識しているようで、その方法で結果のソースツリーをレンダリングすることにします。それはあなたが好むものかもしれませんが、その振る舞いを要求する仕様があるかどうかはわかりません。

于 2012-12-01T13:53:58.873 に答える
0

xsl:output="text"Firefox と Chrome では、改行文字とタブ文字の保持が機能します。皮肉なことに、IE はテキスト モードでインデントを無視します。これを示す自己参照スタイルシートを次に示します。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="newline-indent.xml"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns=""
                >

<!-- Output HTML doctype with text/html content-type and without XML declaration-->
<xsl:output method="text" encoding="utf-8" version="1.0" media-type="text/plain" indent="yes" standalone="no" omit-xml-declaration="no"/>

<!-- Output the HTML markup-->
<xsl:template xml:space="preserve" match="/">
  <root>
    <child>1 &#13;&#10;</child>   
    <child>
      <grandchild>&#09; 1.1  &#13;&#10;</grandchild>
    </child>
    <child>
      <grandchild>
        <great-grandchild>&#09; &#09; 1.1.1</great-grandchild>
      </grandchild>
    </child>
  </root>
</xsl:template>
</xsl:stylesheet>

Mozilla バグからの次のコメントは、XML シリアライゼーションが XML 名前空間で機能しない理由を説明しています。

Gecko の現在のバージョンでは、XML シリアライザーを使用して XHTML コンテンツをシリアライズします。

タグで要素とリテラル スペースを使用してstyle、IE で出力をフォーマットします。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="newline-indent-ie.xml"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns=""
                >

<xsl:output method="xml" encoding="utf-8" version="1.0" media-type="application/xml" indent="yes" standalone="no" omit-xml-declaration="no"/>

<xsl:template match="/">
  <style>* { white-space:pre-wrap; }</style>
  <root>
    <child  >1</child>   
    <child>
      <grandchild  >1.1</grandchild>
    </child>
    <child>
      <grandchild>
        <great-grandchild  >1.1.1</great-grandchild>
      </grandchild>
    </child>
  </root>
</xsl:template>
</xsl:stylesheet>

参考文献

于 2013-04-05T02:22:39.820 に答える