更新XSLT For循环中的XML属性

时间:2013-10-19 08:48:20

标签: xml xslt

在我的Souce XML中,我想重新分配从1到开始的所有实例ID(直到有exixtance)。
我想用Profile元素下的上述值更新Apple,Mango,Banana InstanceId 在这里,我将忽略配置文件InstanceID级别的出现 因为我是XSLT的新手,所以任何一点都是可以接受的 在下面的例子中,我使用了XSLT,但它用1替换了所有的出现。

<Root>
    <Properties>
        <Props></Props>
        <Input>
        </Input>
        <Profile InstanceID ="4" ObjectID="XYZ"> <!-- no need to update these instanceID -->
            <foo>Profile 1</foo>
            <Apple InstanceID="26" ObjectID="ABC" Type="103"></Apple>
            <Mango InstanceID="1" ObjectID="DEF" Type="103"></Mango>
            <Mango InstanceID="27" ObjectID="GHI" Type="103"></Mango>
            <Banana InstanceID="29" ObjectID="GHI1" Type="103"></Banana>
            </Profile>
    </Properties>

    <Properties>
    <Props></Props>
    <Input></Input>
        <Profile InstanceID ="4" ObjectID="XYZ"> <!-- no need to update these instanceID -->
            <foo>Profile 1</foo>
            <Apple InstanceID="33" ObjectID="MNO" Type="103"></Apple>
            <Mango InstanceID="25" ObjectID="PQR" Type="103"></Mango>
            <Mango InstanceID="2" ObjectID="EFG" Type="103"></Mango>
            <Mango InstanceID="28" ObjectID="EFG123" Type="103"></Mango>
            <Banana InstanceID="31" ObjectID="GHI1" Type="103"></Banana>
        </Profile>
    </Properties>
</Root>

以下是我使用的XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="msxsl">

    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:variable name="counter1" select="0"></xsl:variable>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Profile/*/@InstanceID">
        <xsl:attribute name="InstanceID">
            <xsl:value-of select="position()" />
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

这些是输出/转换XML

<Root>
    <Properties>
        <Props></Props>
        <Input>
        </Input>
        <Profile InstanceID ="4" ObjectID="XYZ"> <!-- no need to update these instanceID -->
        <foo>Profile 1</foo>
        <Apple InstanceID="1" ObjectID="ABC" Type="103"></Apple> <!-- Correct -->
        <Mango InstanceID="1" ObjectID="DEF" Type="103"></Mango> <!-- Expected val = 2 -->
        <Mango InstanceID="1" ObjectID="GHI" Type="103"></Mango> <!-- Expected val = 3 -->
        <Banana InstanceID="1" ObjectID="GHI1" Type="103"></Banana> <!-- Expected val = 4 -->
        </Profile>
    </Properties>    
    <Properties>
        <Props></Props>
        <Input></Input>
        <Profile InstanceID ="4" ObjectID="XYZ"> <!-- no need to update these instanceID -->
        <foo>Profile 1</foo>
        <Apple InstanceID="1" ObjectID="MNO" Type="103"></Apple> <!-- Correct -->
        <Mango InstanceID="1" ObjectID="PQR" Type="103"></Mango> <!-- Expected val = 2 -->
        <Mango InstanceID="1" ObjectID="EFG" Type="103"></Mango> <!-- Expected val = 3 -->
        <Mango InstanceID="1" ObjectID="EFG123" Type="103"></Mango> <!-- Expected val = 4 -->
        <Banana InstanceID="1" ObjectID="GHI1" Type="103"></Banana> <!-- Expected val = 5 -->
        </Profile>
    </Properties>
</Root>

1 个答案:

答案 0 :(得分:2)

问题在于

<xsl:value-of select="position()" />

此行不显示fruit-element的position(),而是显示属性@InstanceID的位置(当然,总是1)。

要解决此问题,您不能使用position(),而是计算包含@InstanceID属性的父的所有前面的兄弟

<xsl:value-of select="count(../preceding-sibling::*[@InstanceID]) + 1" />