0

統合している API から受信した XML をフォーマットする XSL の作成に取り組んでいます。私が受け取る xml は次のようになります。

<items>
  <item xmlns="http://www.tempuri.org/Item.xsd">
    <key>value</key>
  </item>
  <item>
    <key>value</key>
  </item>
  <item xmlns="http://www.tempuri.org/Item.xsd">
    <key>value</key>
  </item>
</items>

「item」ノードには、「xmlns」属性が定義されているものと定義されていないものがあります。XSL で結果を繰り返し処理しようとすると、xmlns 属性が定義されているノードが見つかりません。

<xsl:for-each select="item">
  <xsl:value-of select="key" />
</xsl:for-each>

私は XSL 全体に慣れていないので、何が間違っているのかわかりません。

4

2 に答える 2

1

定義で同じ名前空間を定義する必要があります<xsl:stylesheet>

それで:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="http://www.tempuri.org/Item.xsd"
    extension-element-prefixes="exsl"
    encoding="utf-8">

. . .

<xsl:for-each select="item|ns:item">
    <xsl:value-of select="key|ns:key"/>
</xsl:for-each>

実際には、同じものには同じ名前空間を使用するようにしてください。

于 2010-01-25T18:51:11.843 に答える
0

まず、XML 名前空間の仕組みとその意味を理解していなければ、問題は尽きません。あなたが苦労しているこの問題は氷山の一角です。

とはいえ、Kyle Butt が提案した方法で名前空間を処理し、stylesheet要素内の名前空間にプレフィックスのトランスフォーム全体のマッピングを割り当ててから、XPath 式でプレフィックスを使用することができます。

しかし、名前空間がわからない場合はどうすればよいでしょうか? 次に、ブランター楽器を使用する必要があります。

<xsl:for-each select="*[local-name()='item']">
  <xsl:value-of select="*[local-name()='key']"/>
</xsl:for-each>

を使用するとlocal-name()、名前空間が完全に無視されます。ただし、ノード テスト ( のような名前fooまたは修飾名であるx:foo必要があります) では使用できません。述語でのみ使用できます。*[local-name()='foo']それが、愛されないことがそれを行う唯一の方法である理由です。

于 2010-01-27T08:14:35.563 に答える