2017-07-06 158 views
0

我有以下結構XSL值作爲XSL元素名稱

<Rowsets> 
<Rowset> 
    <Row> 
     <ID>123</ID> 
     <PropertyID>property 1</PropertyID> 
     <PropertyValue>value 1</PropertyValue> 
    </Row> 
    <Row> 
     <ID>123</ID> 
     <PropertyID>property 2</PropertyID> 
     <PropertyValue>value 2</PropertyValue> 
    </Row> 
    <Row> 
     <ID>456</ID> 
     <PropertyID>property 1</PropertyID> 
     <PropertyValue>value 11</PropertyValue> 
    </Row> 
    <Row> 
     <ID>456</ID> 
     <PropertyID>property 2</PropertyID> 
     <PropertyValue>value 22</PropertyValue> 
    </Row> 
</Rowset> 

欲組與ID的屬性一起,如在下面的結構

<SEGMENTS> 
<SET> 
    <ID>123</ID> 
    <property 1>value 1</property 1> 
    <property 2>value 2</property 2> 
</SET> 
<SET> 
    <ID>456</ID> 
    <property 1>value 11</property 1> 
    <property 2>value 22</property 2> 
</SET> 

我用這個XSLT表格做這件事

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:key name="ID-sets" match="Row" use="ID" /> 
<xsl:template match="Rowsets/Rowset"> 
    <SEGMENTS> 
     <xsl:for-each select="Row[count(. | key('ID-sets', ID)[1]) = 1]"> 
      <xsl:sort select="ID" /> 
      <SET> 
       <ID> 
        <xsl:value-of select="ID" /> 
       </ID> 

       <xsl:for-each select="key('ID-sets', ID)"> 
        <xsl:sort select="PropertyID" /> 
        <xsl:element name="PropertyID"> 
         <xsl:value-of select="PropertyValue"/> 
        </xsl:element> 
       </xsl:for-each> 
      </SET> 
     </xsl:for-each> 
    </SEGMENTS> 
</xsl:template> 

我幾乎沒有,但有一件事是行不通的元素名稱。 經過一番研究,我發現我需要使用這個: xsl:element name =「{PropertyID}」

除了它不起作用。記事本++會給出警告,說明它無法對當前源應用轉換。 沒有它的工作標籤,但它只是靜態的,而不是變量PropertyID。

這可能是一件小事,但我找不到它。 如果有問題,我僅限於xslt 1.0。

+0

元素名稱中不允許有空格,所以「屬性1」的名稱在XML中無效。你將不得不去掉空間,例如給出'',或者用符號替換空格,就像下劃線一樣。 –

+0

我已經想過了,所以沒有其他辦法,只是避免空間?然後,我將使用兩個靜態標籤來查找屬性名稱和值。醜陋的,但比重命名一切工作少得多。謝謝! –

+0

你可以做一些像''也許? –

回答

0

元素名稱中不允許有空格。 另一種方法是

<Property id="{PropertyID}"> 

由於添C顯示了答案。