1

また、インデントは機能しません!

小さなファイルから XML ファイルを生成する必要があるため、XSL を使用してすべてのファイルをマージしようとしましたが、期待どおりに動作しません。

すべてのファイルがサイトにアップロードされているときに「devices.xml」を表示する場合:

  • FireFox - テキストとして表示
  • InternetExplorer - テキストとして表示
  • Chrome - テキストとして表示

そして、「ファイル|名前を付けて保存」を使用すると-

  • FireFox - 生成された XML - myRoot-device-input1- を保存します。. .
  • InternetExplorer - 元の XML - device_list-file を保存します。. .
  • Chrome - 元の XML - device_list-file を保存します。. .

「devices.xml」をローカル ファイルとして表示する場合:

  • FireFox - テキストとして表示
  • InternetExplorer - 「アクセスが拒否されました。リソースの処理中にエラーが発生しました」
  • Chrome - 空白のページが表示される???

私の質問:

  1. 生成された XML がテキストとして表示されるのはなぜですか?
  2. 元の XML ではなく、生成された XML を保存するようにすべてのブラウザーに強制できますか?

ソースファイル:

devices.xml

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="./mergedocs.xsl" ?>
<device_list> 
 <file name="./device1.xml" />
 <file name="./device2.xml" />
</device_list>

device1.xml

<d>
<i1 v="11" />
<i2 v="11" />
</d>

device2.xml

<d>
<i1 v="22" />
<i2 v="22" />
</d>

probes1.xml

<p name="probes1">
  <Item>"1 Name Pb1"</Item>
  <Item>"2 Name Pb1"</Item>
</p>

probes2.xml

<p name="probes2">
  <Item>"1 Name Pb2"</Item>
  <Item>"2 Name Pb2"</Item>
</p>

mergedocs.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />

<xsl:variable name="probes1" select="document('probes1.xml')" />
<xsl:variable name="probes2" select="document('probes2.xml')" />

<xsl:template match="/">
  <myRoot> 
    <xsl:for-each select="/device_list/file">
      <device>
        <xsl:variable name="k" select="position()" />
        <xsl:apply-templates select="document(@name)/d" >
          <xsl:with-param name="strK" select="$k"/> 
        </xsl:apply-templates>
      </device>     
    </xsl:for-each>
  </myRoot> 
</xsl:template>

<xsl:template match="d">
  <xsl:param name="strK" />    
  <xsl:apply-templates >
    <xsl:with-param name="strK" select="$strK"/> 
  </xsl:apply-templates >
</xsl:template>

<xsl:template match="i1">
 <xsl:param name="strK" />    
 <input1>
   <name><xsl:value-of select="$probes1//Item[position() = $strK]"/></name>
   <value><xsl:value-of select="@v" /></value>
 </input1>
</xsl:template>

<xsl:template match="i2">
 <xsl:param name="strK" />    
 <input2>
   <name><xsl:value-of select="$probes2//Item[position() = $strK]"/></name>
   <value><xsl:value-of select="@v" /></value>
 </input2>
</xsl:template>

</xsl:stylesheet>
4

1 に答える 1

3

ブラウザーに組み込まれている XSLT プロセッサは、特に xml-stylesheet PI を使用して呼び出された場合、HTML を生成していると想定し、結果を HTML であるかのように表示します。これは基本的に、HTML では意味のないすべてのタグを無視することを意味するため、テキストだけで終了します。

あなたが達成しようとしていることの説明から、ブラウザでこれを実行しようとしている理由がわかりません。コマンド ラインまたは GUI から実行できる XSLT プロセッサを使用する方がはるかに優れています。

于 2013-05-22T11:29:10.567 に答える