我必须根据父属性值和子值的组合来更改父节点的属性。我的输入xml如下:
<filters>
<sheetFilter filterUsage="table" labelKey="WR" hidden="false">
<userLogin>U0002</userLogin>
<containers>
<sheetTypeRef name="WorkRequest"/>
</containers>
</sheetFilter>
<sheetFilter filterUsage="table" labelKey="AR" hidden="false">
<userLogin>U0003</userLogin>
<containers>
<sheetTypeRef name="ARRequest"/>
</containers>
</sheetFilter>
<sheetFilter filterUsage="table" labelKey="WR" hidden="false">
<userLogin>U0002</userLogin>
<containers>
<sheetTypeRef name="WorkRequest"/>
</containers>
</sheetFilter>
</filters>
如果@labelKey
重复userLogin
值组合,我必须@labelKey
用附加的计数器替换,并且所需的输出应如下所示:
<filters>
<sheetFilter filterUsage="table" labelKey="WR1" hidden="false">
<userLogin>U0002</userLogin>
<containers>
<sheetTypeRef name="WorkRequest"/>
</containers>
</sheetFilter>
<sheetFilter filterUsage="table" labelKey="AR" hidden="false">
<userLogin>U0003</userLogin>
<containers>
<sheetTypeRef name="WorkRequest"/>
</containers>
</sheetFilter>
<sheetFilter filterUsage="table" labelKey="WR2" hidden="false">
<userLogin>U0002</userLogin>
<containers>
<sheetTypeRef name="WorkRequest"/>
</containers>
</sheetFilter>
</filters>
我编写了以下 xslt 来应用转换:
<xsl:template match="*|@*">
<xsl:copy disable-output-escaping="yes">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="sheetFilter[@labelKey='WR']">
<xsl:param name="i" select="1" />
<xsl:element name="{ local-name() }" disable-output-escaping="yes">
<xsl:for-each select="userLogin[text()='U0002']" >
<xsl:with-param name="i" select="$i +1"/>
<xsl:if test="not(../sheetFilter[@labelKey])">
<xsl:apply-templates select="../@*"/>
</xsl:if>
<xsl:attribute name="labelKey">
<xsl:value-of select="concat('WR', $i)"/>
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
但我得到的是下面的编译器警告:
Compiler warnings:
Attribute 'labelKey' outside of element
并且输出不一致,在某些节点中,计数器值应用于“labelKey”,而在某些节点中,@lableKey 本身缺失。任何人都可以阐明上述xslt中出了什么问题吗?另外我想知道是否可以概括条件,例如 match="sheetFilter[@labelKey='WR']"
是否可以用概括的语句替换WR
and U0002
,因为我不确定可能重复的组合值。
提前致谢。苏珊