2017-07-21 22 views
0

私はXSLとXPATHを使用して、同じ名前の異なる値を持つ複数のノードを持つ複雑なXMLファイルをトラバースし、読み取り、変換しています。 xmlファイルは以下である私のサンプル -xpathとxslを使用したxmlドキュメントのトラブリア

<core> 
    <address> 
     <postalZipCode>90017</postalZipCode> 
     <updateSource>xxxxxx</updateSource> 
     <city>LOS ANGELES</city> 
     <stateProvince>CA</stateProvince> 
     <type>MAILING</type> 
     <line1>818 WEST SEVENTH STREET</line1> 
    </address> 
    <address> 
     <postalZipCode>95014</postalZipCode> 
     <updateSource>xxxxxx</updateSource> 
     <city>CUPERTINO</city> 
     <stateProvince>CA</stateProvince> 
     <type>PRIMARY</type> 
     <line1>1234 XYZ STREET</line1> 
    </address> 
    <memberId>0</memberId> 
</core> 

私はメーリングリストのアドレスラインに1つの値を読んだとき、私は取得しています値は、本質的にプライマリアドレスである「1234 XYZ STREET」です。ここに私のXSLファイルの抜粋は次のとおりです。 -

<xsl:template match="core">  
    <xsl:if test="memberId['0'] and address/type['MAILING']"> 
    <fo:table-row> 
     <fo:table-cell><fo:block /></fo:table-cell>      
     <fo:table-cell xsl:use-attribute-sets="data"> 
      <fo:block>Line 1</fo:block> 
     </fo:table-cell> 
     <fo:table-cell xsl:use-attribute-sets="data"> 
      <fo:block><xsl:value-of select="address/line1/text()"/> 
     </fo:block> 
     </fo:table-cell>            
    </fo:table-row> 

アドレスが郵送された場合の正しい値を読み出すためにXSLを強制することができ、他の方法がある場合は、ここでの専門家ではなく、最初に見つかった値を読んで、提案してくださいでした???

+0

"私が得ている価値は" 1234 XYZ STREET "*"いいえ、それはあなたがここに投稿したコードを使って得ている** **値ではありません。 –

答えて

1

アドレスに郵送する代わりに、最初に見つかった値 を読み取っている場合の正しい 値を読み取るためにXSLを強制することが可能と他の方法があれば?

を郵送するあなたの例の最初のアドレスであるため、あなたの質問は、かなり混乱して - そしてあなたが表示さスニペットはあなたはそれがないと言う結果を生成しないありません。いずれの場合においても

、あなたはその位置に関係なく、メーリングリストのアドレスからデータを取得することを確認するために、これを変更:

<xsl:value-of select="address/line1/text()"/> 

へ:

<xsl:value-of select="address[type='MAILING']/line1"/> 

がどのようにこの作品を理解するために詳しくはpredicatesをご覧ください。

1

あなたが書いたコードには、「MAILINGタイプのアドレスがある場合は、address/line1の値を印刷します(MAILINGタイプのアドレスに関係なく)」と表示されます。

XSLT 1.0では、xsl:value-ofが複数のノードを選択すると、見つかった最初のノードの値が表示されます。 XSLT 2.0では、選択されたすべてのノードの値を連結し、区切り文字はデフォルトで単一のスペースになります。

ノードが複数あり、特定のノードを選択する場合は、述語で選択します。 xsl:value-of select="address[@type='MAILING']/line1

+0

"* XSLT 2.0では、これはエラーです。*"このようなエラーを記述するXSLT 2.0仕様では何も見つかりません。反対に、 'xsl:value-of'命令は複数のノード選択を扱うための' separator'属性を持っています。 –

+0

申し訳ありません、はい、私は間違っています。 XSLT 1.0では、ノードセットの最初のノードを選択するほとんどのことがXSLT 2.0のエラーになりますが、xsl:value-ofは例外です。ノードセット内のすべてのノードを処理するように変更されます。答えを訂正する。 –

関連する問題