2

XML:

<Grandparent>
  <Parent>
    <Children id ="1">
      <Info>
        <Name>
          <label name ="chname" />
        </Name>
      </Info>
    </Children>
    <Children name ="2">
      <Info>
        <Name>
          <label name="chname" />
        </Name>
      </Info>
    </Children>
    <Children id ="3">
      <Info>
        <Name>
          <label name="chname" />
        </Name>
      </Info>
    </Children>
  </Parent>
</Grandparent>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />  

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

<xsl:template match="label">
  <label id="../../../preceding-sibling::Children/@id">
    <xsl:apply-templates select="@*|node()"/>
  </label>
</xsl:template>

</xsl:stylesheet>

期待される出力:

<Grandparent>
      <Parent>
        <Children id ="1">
          <Info>
            <Name>
              <label id="1" name ="chname" />
            </Name>
          </Info>
        </Children>
        <Children name ="2">
          <Info>
            <Name>
              <label id="2" name="chname" />
            </Name>
          </Info>
        </Children>
        <Children id ="3">
          <Info>
            <Name>
              <label id="3" name="chname" />
            </Name>
          </Info>
        </Children>
      </Parent>
    </Grandparent>

テンプレートを介して「ラベル」タグに属性IDを追加しています。Childrenノードから属性「id」を取得するにはどうすればよいですか? これは私のコードです

<label id="../../../preceding-sibling::Children/@id"> 

それは動作しません。ここで何か不足していますか?

前もって感謝します :)

4

2 に答える 2

3

Xpath 式の結果を属性として取得する場合は、属性値テンプレートを使用する必要があるため、このように記述する必要があります。

<label id="{../../../preceding-sibling::Children/@id}"> 

中括弧は、文字どおりに出力される文字列ではなく、評価される式であることを示します。

ただ、この場合は表現が間違っていると思います。実際にこれを行う必要があります:

<label id="{../../../@id}">

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />  

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

<xsl:template match="label">
  <label id="{../../../@id}">
    <xsl:apply-templates select="@*|node()"/>
  </label>
</xsl:template>

</xsl:stylesheet>

XML に適用すると、以下が出力されます。

<Grandparent>
   <Parent>
      <Children id="1">
         <Info>
            <Name>
               <label id="1" name="chname"/>
            </Name>
         </Info>
      </Children>
      <Children name="2">
         <Info>
            <Name>
               <label id="" name="chname"/>
            </Name>
         </Info>
      </Children>
      <Children id="3">
         <Info>
            <Name>
               <label id="3" name="chname"/>
            </Name>
         </Info>
      </Children>
   </Parent>
</Grandparent>
于 2012-12-11T07:27:43.600 に答える
2

あなたはAVTを使うことができます:

<label id="{../../../@id}"> 
于 2012-12-11T07:25:23.180 に答える