XSLT 'value-of select' 对不同级别的多属性检查

XSLT 'value-of select' on multiple attribute check at different level

这是一个简化的 Xml 问题示例,我 facing.I 必须通过匹配 NameID 在输出 xml 中设置属性 Class 值& SRNo<Info></Address> 中。注意:属性处于不同级别。

<Detail   DetailKey="11119612" DetailNo="123456" DetailType="A">
    <Infos>
        <Info InfoKey="11111599613" SRNo="1" Class="C">
            <NameID NameID="121212" />
        </Info>
        <Info InfoKey="11111599612" SRNo="2" Class="A" >
            <NameID NameID="121213" />
        </Info>     
    </Infos>
    <Addresss>
        <Address AddressKey="11111591234" SRNo="1" >
            <NameID NameID="121212" />
        </Address>
        <Address AddressKey="11111593243" SRNo="2" >
            <NameID NameID="121213" />
        </Address>      
    </Addresss>
</Detail>

我试过的。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" indent="yes" />
   <xsl:template match="/">
      <Detail>
         <Infos>
            <xsl:for-each select="Detail/Addresss/Address">
               <Info>
                  <xsl:attribute name="AddressKey">
                     <xsl:value-of select="@AddressKey" />
                  </xsl:attribute>
                  <xsl:variable name="vSRNo" select="@SRNo" />
                  <xsl:variable name="vNameID" select="NameID/@NameID" />
                  <xsl:attribute name="Class">
                     <xsl:value-of select="../../Infos/Info[@SRNo=$vSRNo]/Name[@NameID=$vNameID]/../@Class" />
                  </xsl:attribute>
               </Info>
            </xsl:for-each>
         </Infos>
      </Detail>
   </xsl:template>
</xsl:stylesheet>

这里出现了三个错误:

  • 您有名为 NameID 的元素,而不是 Name(有两处错误)
  • @ClassNameID 上的一个属性,所以你不需要在它前面加上 ../

修复这些后,它会按预期工作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="/">
    <Detail>
      <Infos>
        <xsl:for-each select="Detail/Addresss/Address">
          <Info>
            <xsl:attribute name="AddressKey">
              <xsl:value-of select="@AddressKey" />
            </xsl:attribute>
            <xsl:variable name="vSRNo" select="@SRNo" />
            <xsl:variable name="vNameID" select="NameID/@NameID" />
            <xsl:attribute name="Class">
              <xsl:value-of select="/*/Infos/Info[@SRNo = $vSRNo and 
                                                  NameID/@NameID = $vNameID]/@Class" />
            </xsl:attribute>
          </Info>
        </xsl:for-each>
      </Infos>
    </Detail>
  </xsl:template>
</xsl:stylesheet>

整理一下:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:key name="kInfo" match="Info"
           use="concat(@SRNo, '+', NameID/@NameID)"/>

  <xsl:template match="/">
    <Detail>
      <Infos>
        <xsl:apply-templates select="Detail/Addresss/Address" />
      </Infos>
    </Detail>
  </xsl:template>

  <xsl:template match="Address">
    <Info AddressKey="{@AddressKey}" 
          Class="{key('kInfo', concat(@SRNo, '+', NameID/@NameID))/@Class}" />
  </xsl:template>
</xsl:stylesheet>