Мне нужно изменить атрибут родительского узла на основе комбинации значения родительского attirbute и дочернего значения. Мой вход 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
со счетчиком appeneded и желаемого выхода должно быть, как:
<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
и U0002
на обобщенный оператор, так как я не уверен в значениях комбинации, которые могут повторяться.
Заранее спасибо. Susan
Для меня это не имеет значения. Решение отлично работает. Еще раз спасибо. – smj100