2015-04-24 61 views
0

我從無法操作的在線服務獲取XML輸出。 TableHeader節點包含列名稱。使用XSLT 1.0,如何使用TableHeader中的元素重命名通用Attribute元素?如何使用頭節點的元素重命名通用XML元素

XML輸入:

<?xml version="1.0" encoding="UTF-8"?> 
<SearchResults> 
    <TableHeader> 
     <ColumnName>Surname</ColumnName> 
     <ColumnName>FirstNames</ColumnName> 
     <ColumnName>Gender</ColumnName> 
     <ColumnName>Age</ColumnName> 
    </TableHeader> 
    <Object> 
     <Attribute>Linder</Attribute> 
     <Attribute>Sophie</Attribute> 
     <Attribute>Female</Attribute> 
     <Attribute/> 
    </Object> 
    <Object> 
     <Attribute>?</Attribute> 
     <Attribute>Thomas</Attribute> 
     <Attribute>Male</Attribute> 
     <Attribute>26</Attribute> 
    </Object> 
    <Object> 
     <Attribute>Akona</Attribute> 
     <Attribute>Lettie</Attribute> 
     <Attribute>Female</Attribute> 
     <Attribute>35</Attribute> 
    </Object> 
    <Object> 
     <Attribute>Linder</Attribute> 
     <Attribute>Fred</Attribute> 
     <Attribute>Male</Attribute> 
     <Attribute>38</Attribute> 
    </Object> 
    <Object> 
     <Attribute>Akona</Attribute> 
     <Attribute>Alicia</Attribute> 
     <Attribute>Female</Attribute> 
     <Attribute/> 
    </Object> 
</SearchResults> 

所需的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<SearchResults> 
    <Object> 
     <Surname>Linder</Surname> 
     <FirstNames>Sophie</FirstNames> 
     <Gender>Female</Gender> 
     <Age/> 
    </Object> 
    <Object> 
     <Surname>?</Surname> 
     <FirstNames>Thomas</FirstNames> 
     <Gender>Male</Gender> 
     <Age>26</Age> 
    </Object> 
    <Object> 
     <Surname>Akona</Surname> 
     <FirstNames>Lettie</FirstNames> 
     <Gender>Female</Gender> 
     <Age>35</Age> 
    </Object> 
    <Object> 
     <Surname>Linder</Surname> 
     <FirstNames>Fred</FirstNames> 
     <Gender>Male</Gender> 
     <Age>38</Age> 
    </Object> 
    <Object> 
     <Surname>Akona</Surname> 
     <FirstNames>Alicia</FirstNames> 
     <Gender>Female</Gender> 
     <Age/> 
    </Object> 
</SearchResults> 

我是很新的XSLT,所以我還沒有走多遠,但這裏是我當前的嘗試。我想我可以使用xsl:variable來設置列名,然後將它們用作元素標籤,但我相信肯定有更好的方法。另外,它理想地適用於可變數量的列。

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

<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:variable name ="column1" select ="(ColumnName)[1]" /> 
    <xsl:template match ="Object"> 
    <Object> 
     <Surname> 
     <xsl:value-of select="(Attribute)[1]"/> 
     </Surname> 
     <FirstName> 
     <xsl:value-of select="(Attribute)[2]"/> 
     </FirstName> 
     <Gender> 
     <xsl:value-of select="(Attribute)[3]"/> 
     </Gender> 
     <Age> 
     <xsl:value-of select="(Attribute)[4]"/> 
     </Age> 
    </Object> 
    </xsl:template> 

</xsl:stylesheet> 

我的最終目標是這些使用Muenchian方法能集團,但我的理解是,有更多的描述性的元素名稱會提出這樣方便很多。如果可以在不重新命名的情況下一步完成,請在評論中告訴我,我將爲此發佈一個單獨的問題。

+0

「*我的最終目標是要能集團這些使用Muenchian方法,但我的理解是,具有更多描述性元素名稱會使這更容易。「我完全不相信它會。你想將他們分組? –

+0

@ michael.hor257k我會把他們歸於姓氏。 – rudivonstaden

+0

它可以通過任何方式完成。編碼時可能會更簡單一些,但是爲了達到這個目的,您必須做兩次傳球,所以... –

回答

1

這應該爲你工作,前提是所提供的列名也是有效的XML元素名稱:

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="*"/> 

<xsl:variable name="column-names" select="/SearchResults/TableHeader/ColumnName" /> 

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

<xsl:template match="Attribute"> 
    <xsl:variable name="i" select="position()" /> 
    <xsl:element name="{$column-names[$i]}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="TableHeader"/> 

</xsl:stylesheet> 
+0

謝謝@ michael.hor257k。我將首先嚐試使用此樣式表中的翻譯進行分組。一旦我明白了,我會看看我是否可以將其削減爲一次。 – rudivonstaden