2017-07-06 123 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显示了答案。