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
(有两处错误)
@Class
是 NameID
上的一个属性,所以你不需要在它前面加上 ../
。
修复这些后,它会按预期工作:
<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>
这是一个简化的 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
(有两处错误) @Class
是NameID
上的一个属性,所以你不需要在它前面加上../
。
修复这些后,它会按预期工作:
<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>