2013-10-19 72 views
2

在我的Souce XML中,我想重新分配數字1之前的所有實例ID(直到存在exixtance)。
我想在Profile元素下更新Apple,Mango,Banana InstanceId的以上值。
在這裏,我將忽略配置文件InstanceID級別的發生。
由於我是XSLT的新手,任何一點都不難理解。
在以下實施例I使用了XSLT,但它與1更新XSLT For-Loop中的XML屬性

<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> 

下面全部更換次數爲i使用

<?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> 

的XSLT而這些是輸出/轉換的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> 

回答

2

問題出在

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

此行不顯示水果元素的position(),但屬性@InstanceID的位置(自然也就是1)。

爲了解決這個問題,你一定不要使用position()但算上之前的所有兄弟姐妹包含@InstanceID屬性父的

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

「屬性@InstanceID的位置(至極,自然就始終爲1 )「。實際上,由於有三個屬性,而且訂單未定義,所以此處的位置()可以等於2或3. –

+0

是的,我認爲是這種情況。 「總是1」的意思更具形象化,表明它與屬性元素的位置無關。 –

+0

感謝Nils確實有效。你能否建議如何應用這樣一個條件:只有當一個集合中至少有一個instanceid大於25時,重新分配實例id的上述邏輯才能工作? –