0

別の名前空間から XSLT ファイルに XML 要素を追加するときに、問題が発生することを予期する必要がありますか? それとも、単に無視されますか (素晴らしいと思います)?

バックグラウンド: 大規模なプロジェクトでは、ユーザーはテキストの書式設定などにユーザー定義のタグを使用できます (たとえば\textbf{bold}、最初に XML の特定の方言に変換され (最初に独自のツールを使用し、次に XSLT を使用)、その後で他の言語に変換される可能性があります)。ラテックス、フレームメーカー、BB コードなどの方言...

このため、現在、次のファイルがあります。

  1. \textbf{bold}に変換される専用ツールの構成ファイル<Cmd Name="strong"><param Nr="1">bold</param></Cmd>
  2. 上記の XML コードを次のように変換する XSLT ファイル<myns:strong>bold</myns:strong>
  3. 許可されたタグとフォーマットを記述した XSD ファイル
  4. 異なる出力形式に変換するための複数の xsl ファイル<myns:strong>bold</myns:strong>(例: に戻す\textbf{bold})

実際には 1:1 のマッピングがなく、新しいコマンドを追加するには複数のファイルを正しい方法で変更する必要があるため、これらのファイルを維持することは非常に困難です。

したがって、私の考えはこれらをマージすることです。たとえば、単一の XML ファイルには次のものが含まれます。

<!-- config file for proprietary tool -->
<repl:Cmd Name="strong"><repl:Param Nr="1"/></repl:Cmd>

<!-- converting to XML dialect -->
<xsl:template mode="Text" match="Cmd[@Name = 'textbf']">
   <myns:strong>
       <xsl:apply-templates select="Param[@Nr='1']" mode="Text"/>
   </myns:strong>
</xsl:template>

<!-- XSD schema for validating XML -->
<xsd:element name="strong" type="tns:GenericTextType">
</xsd:element>

<!-- converting XML dialect to latex code -->
<xsl:template match="myns:strong" mode="Text_toLatex">
    <xsl:text disable-output-escaping="yes">\textbf{</xsl:text>
       <xsl:apply-templates mode="Text_toLatex"/>
    <xsl:text disable-output-escaping="yes">}</xsl:text>
</xsl:template>

これにより、メンテナンスがはるかに簡単になります。

4

2 に答える 2

4

xsl:stylesheet要素の子として表示されるXSLT名前空間以外の名前空間の要素は、XSLTプロセッサによって認識される名前空間でない限り無視されます。たとえば、Saxonプロセッサは名前空間内の要素に特別な意味を付加します。http://saxon.sf.net/

ただし、どの名前空間にも存在しない要素はエラーです。

于 2012-06-25T09:59:59.127 に答える
4

別の名前空間から XSLT ファイルに XML 要素を追加するときに、問題が発生することを予期する必要がありますか? それとも、単に無視されますか (素晴らしいと思います)?

問題はありません。XSLT プログラムは通常の XML ドキュメントです。一般に、任意の要素 (名前空間であろうとなかろうと) をドキュメントに追加すると、それらがプログラムの一部になります。

名前空間を持つ要素はどこでも使用できますが、名前空間を持たない要素を の子にすることはできません<xsl:stylesheet>

それらが の子である場合<xsl:template>、それらは結果に出力されます。それ自体の子である場合<xsl:stylesheet>、それらは出力されません (つまり、「無視」されます)。

あなたがしなければならないのは、

  • 使用する名前空間を宣言して、XSLT の形式を維持します (これは基本的な XML 要件であり、使用する名前空間を常に宣言する必要があります)。
  • exclude-result-prefixesディレクティブを使用して、不要な名前空間が結果ドキュメントに出力されるのを防ぎます。

.

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:repl="http//tempuri.org/repl"
  xmlns:tns="http//tempuri.org/tns"
  xmlns:myns="http//tempuri.org/myns"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="tns myns"
> 
  <!-- config file for proprietary tool -->
  <repl:Cmd Name="strong"><repl:Param Nr="1"/></repl:Cmd>

  <!-- converting to XML dialect -->
  <xsl:template mode="Text" match="Cmd[@Name = 'textbf']">
    <myns:strong>
      <xsl:apply-templates select="Param[@Nr='1']" mode="Text"/>
    </myns:strong>
  </xsl:template>

  <!-- XSD schema for validating XML -->
  <xsd:element name="strong" type="tns:GenericTextType">
  </xsd:element>

  <!-- converting XML dialect to latex code -->
  <xsl:template match="myns:strong" mode="Text_toLatex">
    <xsl:text>\textbf{</xsl:text>
      <xsl:apply-templates mode="Text_toLatex"/>
    <xsl:text>}</xsl:text>
  </xsl:template>

</xsl:stylesheet>

これらのノードを明示的に使用する XSLT コードを記述しない限り、 <repl:Cmd>andでは何も起こりません。<xsd:element>これらは XPath のようにアクセスできますdocument('')/*/xsd:element(*は のショートカットですxsl:stylesheet)。

実際、これは追加の構造化データ (構成テーブルやルックアップ テーブルなど) を XSLT ドキュメントに格納するための一般的な手法です。


補足: 通常、 は使用しないでくださいdisable-output-escaping。あなたの特定のコードでは、それは不要です。

于 2012-06-25T09:03:26.717 に答える