0

"xsi:schemaLocation="location1 location2 ..." と "xmlns:someNs" が大量に含まれる xml ファイルを取得しました。名前空間は新しいドキュメントにコピーされますが、schemaLocations はそうではなく、なぜそれらが存在するのかわかりません削除されます (すべての名前空間と schemaLocations も私のスタイルシートにあります)。

Googleは、ドキュメント内またはこのようなもので使用されていない場合は削除されると言っています。自分で追加する必要がありますが、できないようです... xalanパイプラインを使用していくつかの基本的な変換をパイプしていますが、今パイプの最後にスタイルシートを追加して、場所を再度追加しようとしています。これは私の最後のシートです:

<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="/*">
    <xsl:attribute name="xsi:schemaLocation">
      <xsl:text>MYLOCATION</xsl:text>
    </xsl:attribute>

    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>

</xsl:template>

コピーなしで要素タグを囲むいくつかのバリアントがありました...最良の結果は、schemaLocationを持つ二重化されたルート要素と、私が本当に理解できないすべての名前空間を持つものでした。

助けてくれてありがとう;)

€: xalan パイプを除いて、私の個々のスタイルシートはすべて機能しているようです。

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:pipe="http://xml.apache.org/xalan/PipeDocument"
                extension-element-prefixes="pipe"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="someschema"
              >

  <xsl:param name="source"/>
  <xsl:param name="target"/>

  <!-- I think this block has no effect -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">

    <pipe:pipeDocument 
          source="{$source}"
          target="{$target}">
      <stylesheet href="sheet1.xsl"/>
      <stylesheet href="sheet2.xsl"/>
      <stylesheet href="sheet3.xsl"/>
    </pipe:pipeDocument>

  </xsl:template>

</xsl:stylesheet>

Xalan は -IN および -OUT で呼び出されなくなりました。xmlns 宣言がまだ出力にある理由がわかりませんが、その場所が失われると思います。すべてのシートは独自の恒等変換を行い、パイプなしで使用すると期待どおりに機能します。

4

1 に答える 1

3

xsi:schemaLocation入力データ、出力データ、またはその入力からその出力を生成するテンプレートを表示していないため、属性が出力から消えている理由は明らかではありません。

表示するテンプレートは、まったく結果を生成できないため、説明した結果を生成することはできません。(簡潔にするためにそれらを編集したと思いますが、これは一般的には良い考えですが、行き過ぎです。) テンプレート マッチング/*は、出力で要素が開かれていない状態で属性を書き込もうとしています。このテンプレートの一部のバリアントが機能したが、ルート要素が 2 重になった場合、それはテンプレートに 2 つの要素があったためだと思いますxsl:copy

xsi:schemaLocationID スタイルシートの作業バージョンから開始すると、名前空間の宣言と属性の両方が出力に表示されることがわかると思います 。

たとえば、次のスタイルシートを考えてみましょう (コメントと処理命令のテンプレートが省略されています)。

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  version="1.0">
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

次の入力に適用します。

<test 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:foo="http://example.com/foo"
  xmlns:bar="http://example.com/bar"
  xsi:schemaLocation="http://example.com/foo foo.xsd
                      http://example.com/bar nss/bar.xsd">
  <data/>
</test>

私が得る結果は次のとおりです。

<test 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:foo="http://example.com/foo" 
  xmlns:bar="http://example.com/bar" 
  xsi:schemaLocation="
    http://example.com/foo foo.xsd
    http://example.com/bar nss/bar.xsd">
  <data/>
</test>

xsi:schemaLocationある。名前空間宣言があります。それらが既存のスタイルシートからの出力にない場合は、この作業コードを既存のコードに近づけるように段階的に変更します。スキーマの場所の属性や名前空間が出力に表示されなくなった時点で、エラーが見つかりました。

xsi:schemaLocation推測する必要がある場合は、入力に一致するテンプレートがないため、および/または親に一致するテンプレートに含まれていないため、属性が既存のスタイルシートによって削除されていると推測しますxsl:apply-templatesselect="@*"

于 2012-08-21T16:54:29.117 に答える