1

ソースが次のように見える call-template に取り組んでいます。

ソース:

    <Content>
         <first>
                <text>
                Text
            </text>
            <link xmlns="Some namespace">
                <AA>abcd</AA>
                <BB>hi all</BB>
            </link>
         </first>

         <second>
         <link xmlns="Some other namespace">
                <AA>abcd1</AA>
                <BB>hi all21</BB>
            </link>
         </second>

          <three>
         <link xmlns="other namespace">
                <AA>abcd2</AA>
                <BB>hi all33</BB>
            </link>
         </three>
    </Content>

書かれた XSLT:

           <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:n1="Some namespace" xmlns:n2="Some other namespace" xmlns:n3="other namespace">
        <xsl:output method="xml" indent="yes"/>

      <xsl:template match="Content">
       <xsl:call-template name="process">
         <xsl:with-param name="item" select="first/n1:link" />
    </xsl:call-template>
         <xsl:call-template name="process">
         <xsl:with-param name="item" select="second/n2:link" />
    </xsl:call-template>
         <xsl:call-template name="process">
         <xsl:with-param name="item" select="three/n3:link" />
    </xsl:call-template>


      </xsl:template>

      <xsl:template name="process">
        <xsl:param name="item" />
        <xsl:value-of select="$item/AA" />
      </xsl:template>

    </xsl:stylesheet>

名前空間プレフィックスを追加しなかったため、空白の出力が表示されます。理由はわかっています。「n1:A」みたいな。

が何度も来るので。テンプレートを作成し、必要に応じて呼び出しました。しかし、各リンクの名前空間は異なります。テンプレート「プロセス」を再利用できるように、コードを変更します。

名前空間が異なるが同じ構造で処理するように、それに応じて「プロセス」テンプレートを変更するにはどうすればよいですか。

ありがとうございました。

4

2 に答える 2

0

これは設計が不十分な XML ドキュメントであることを指摘しておく必要があります。N1 のローカル名が N2 のローカル名と同じになるような 2 つの名前空間 N1 と N2 を誰かが作成しているのを見たときはいつでも、設計の匂いを検出する必要があります。彼らは XML を人々が処理するのをはるかに困難にしています。

この種の入力を見ると (ボキャブラリのバージョン 2 の名前空間 URI を誤って変更した場合に発生することがあります)、通常、それを処理する最善の方法は、最初のフェーズで名前空間を正規化するパイプラインを作成することだと思います。 、「実際の」処理ロジックは、コードが行っているように複数の名前空間を処理する必要がなく、常にスパゲッティのように見えます。

于 2012-06-01T08:18:11.677 に答える
0

これを行う代わりに

<xsl:value-of select="$item/AA" />

このように表現を変えることができます

<xsl:value-of select="$item/*[local-name() = 'AA'][namespace-uri()=namespace-uri($item)]" />

つまり、名前空間のない名前が 'AA' であり、親要素と同じ名前空間を持つことを確認します。これは、別の名前空間を持つ「link」要素内に別の「AA」要素がある場合、それは選択されないことを意味します。

于 2012-06-01T06:16:12.933 に答える