我必須根據父屬性值和子值的組合來更改父節點的屬性。我的輸入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
值組合重複的情況下,我有appeneded計數器和所希望的輸出,以取代@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
和輸出並不一致,在某些節點@lableKey本身缺少計數器值被應用到「labelKey」在某些節點。任何人都可以在上述xslt中發現問題嗎?此外,我想知道是否有可能推廣該條件,例如match="sheetFilter[@labelKey='WR']"
是否有可能用一個通用語句替換WR
和U0002
,因爲我不確定可能會重複的組合值。
在此先感謝。 蘇珊
訂單對我來說並不重要。該解決方案效果很好。再次感謝。 – smj100 2013-05-09 10:10:55