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 回答