【发布时间】:2017-07-06 12:42:43
【问题描述】:
我有以下结构
<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}"
除了,它不起作用。 Notepad++ 给出了无法对当前源应用转换的警告。 如果没有 {} 标记,它可以工作,但它只是静态的,而不是变量 PropertyID。
这可能是一件小事,但我找不到。 如果这很重要,我仅限于 xslt 1.0。
【问题讨论】:
-
元素名称中不允许有空格,因此
Property 1的名称在 XML 中无效。您必须去掉空格,例如给出<Property1>,或者用下划线之类的符号替换空格。 -
我已经考虑过了,所以除了避免空格之外没有别的办法吗?然后,我将使用两个静态标签,用于属性名称和值。丑陋,但比重命名所有内容要少得多。谢谢!
-
你可以做类似
<Property id="{PropertyID}">的事情吗? -
这似乎是我能得到的最接近一个好的 XML 结构的地方。谢谢!