2012-08-31 44 views
3

我試圖改變變換的非編號列表編號列表使用XSLT

<Address> 
    <Line>Some street1</Line> 
    <Line>Some street2</Line> 
    <Line>Some street3</Line> 
    ... 
</Address> 

<Address1>Some street1</Address1> 
<Address2>Some street2</Address2> 
<Address3>Some street3</Address3> 
<Address4></Address4> 
<Address5></Address5> 

第一個XML是延展性,如果neccessary,但是第二個XML可以重新定義是我無法改變的遺留系統的一部分。 大部分我發現的東西都指向我使用屬性,但不幸的是,它的元素本身我想編輯。

任何人都可以協助或否則,指向正確的方向嗎?

回答

2

一樣方便這一點,可能是最短的解決方案

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

<xsl:template match="Line"> 
    <xsl:element name="Address{position()}"><xsl:apply-templates/></xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

當這一轉變應用於提供的XML文檔:

<Address> 
    <Line>Some street1</Line> 
    <Line>Some street2</Line> 
    <Line>Some street3</Line> 
</Address> 

的想要的,正確的結果產生:

<Address1>Some street1</Address1> 
<Address2>Some street2</Address2> 
<Address3>Some street3</Address3> 

說明

正確使用xsl:element和AVTS(Attribute Value Templates)。

1

看看<xsl:element>元素。在其name屬性,還可以提供在運行XSLT是計算表達式:

<xsl:template match="Line"> 
    <xsl:element name="{concat('Address', position())}"><xsl:value-of select="text()"/></xsl:element> 
</xsl:template> 

更新:position()是一個基礎。

+0

+1 - 4秒內擊敗我。小挑 - 職位()是1基於所以不認爲你需要添加1. – StuartLC

+0

@nonnb:哦,對,謝謝。更新了我的答案。太習慣於零基列表語言;-) –

1

它可以通過重整與當前position()一個新的元素來實現:

<xsl:template match="/Address"> 
    <Addresses> 
     <xsl:for-each select="Line"> 
      <xsl:variable name="elename" select="concat('Address', string(position()))"></xsl:variable> 
      <xsl:element name="{$elename}"> 
       <xsl:value-of select="text()"/> 
      </xsl:element> 
     </xsl:for-each > 
    </Addresses> 
</xsl:template>