2015-10-20 36 views
1

my last answered question串聯的屬性,我現在正在試圖刪除的兩個屬性,並使用他們的連接值創造一個新問題:XSLT:未知名

輸入:

<A> 
<B> 
    <elemX att1="SN:" att2="toto1" att3="tata" SerialNumber="123X" /> 
    <elemY att1="SN:" att2="toto2" att3="tata" SerialNumber="123Y" /> 
</B> 
<B> 
    <elemX att1="tata1" att2="SN:" att3="toto" SerialNumber="456X" /> 
    <elemY att1="tata2" att2="SN:" att3="toto" SerialNumber="456Y" /> 
</B> 
<B> 
    <elemX att1="toto1" att2="tata" att3="SN:" SerialNumber="789X" /> 
    <elemY att1="toto" att2="tata2" att3="SN:" SerialNumber="789Y" /> 
</B> 

所需輸出:

<A> 
<B> 
    <elemX SerialHarnessNumber="SN:"123X att2="toto1" att3="tata" /> 
    <elemY SerialHarnessNumber="SN:123Y" att2="toto2" att3="tata" /> 
</B> 
<B> 
    <elemX att1="tata1" SerialHarnessNumber="SN:456X" att3="toto" /> 
    <elemY att1="tata2" SerialHarnessNumber="SN:456Y" att3="toto" /> 
</B> 
<B> 
    <elemX att1="toto1" att2="tata" SerialHarnessNumber="SN:789X" /> 
    <elemY att1="toto" att2="tata2" SerialHarnessNumber="SN:789Y" /> 
</B> 

元素的順序在這裏並不重要。

要做到這一點,我用下面的XSL:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="@*[.='SN:']" > 
    <xsl:attribute name="SerialHarnessNumber"> 
     <xsl:value-of select="concat('SN:', @SerialNumber)" /> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="@SerialNumber" /> 

就目前而言,我只設法顯示 「SN:」 在的SerialNumber屬性,但SerialHarnessNumber不與它連接,雖然我用@SerialNumber,這是一種先前在另一個XSLT上工作的語法。

我認爲問題來自事實,即SN:值永遠不在同一個元素中。

如何連接SerialNumber值與attX的值?

回答

1

差不多。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="@*[.='SN:']" > 
     <xsl:attribute name="SerialHarnessNumber"> 
      <xsl:value-of select="concat('SN:', ../@SerialNumber)" /> 
      <!-- _______________________________^^^    --> 
     </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="@SerialNumber" /> 

</xsl:stylesheet> 
+0

差不多,確實......它的工作原理,非常感謝你! :) –

0

使用../@SerialNumber來選擇父元素的屬性。

+0

與接受的答案相同的解決方案,但3分鐘後...也謝謝你:) –

0

這難道不簡單嗎?

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="@SerialNumber"> 
    <xsl:attribute name="SerialHarnessNumber"> 
      <xsl:value-of select="concat('SN:', .)" /> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="@*[.='SN:']"/> 

</xsl:stylesheet> 
+0

這是另一種工作正常的方式,謝謝你分享!它對輸出文件具有相同的效果,只是屬性被排序。由於輸出文件不應該被讀取,所以訂單並不重要,但我爲了更多的項目保存您的解決方案;) –

+0

這些屬性並非真正的「排序」。我只是認爲修復已經具有重要價值的屬性會更直接。結果,序列號保持其現有位置。 - 順便說一句,XML規範明確指出屬性的順序沒有意義。 –

+0

但是,如果您需要直接查看XML內容,則更加舒適,但這裏不是這種情況。感謝您的解釋 :) –