【发布时间】:2018-01-30 17:01:03
【问题描述】:
首先要说:我们不是经验丰富的 XSLT 程序员。
我们当前的系统无法导出带有属性的 xml 元素。系统只创建块和成员。为此,我们想出了一个替代方案,其中包含一个元素的块,然后使用 XSLT 将“虚拟”元素转换为具有第一个子元素的值和基于其他子元素的属性的真实元素。
原来的xml是:
<block id="ELEM_InvoiceTypeCode">
<members>
<member id="InvoiceTypeCode">380</member>
<member id="listID">UNCL1001</member>
<member id="listAgencyID">6</member>
</members>
</block>
我们的目标是得到下面的xml:
<cbc:InvoiceTypeCode listAgencyID="6" listID="UNCL1001">380</cbc:InvoiceTypeCode>
有人可以帮忙解决所需的 XSLT 吗?我们可以找到很多关于创建具有属性的元素的信息,但也没有关于向元素添加值的信息。请参阅下面我们想要使用但不允许使用的代码。
<xsl:element name="cbc:{substring(@id,6,999)}">
<xsl:value-of select="members/*[1]"/>
<xsl:for-each select="members/member">
<xsl:attribute name="{@id}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
</xsl:element>
有人知道如何使用 XSLT 做到这一点吗?
【问题讨论】:
-
如果您将 xsl:for-each 放在 xsl:value-of 之前,它应该可以工作。 (您需要在任何内容之前创建属性。)
-
另外,如果block id总是以
ELEM_开头,将substring(@id,6,999)改为substring-after(@id,'ELEM_')更容易理解imo。