首先要说的是:我们没有经验的XSLT程序员。
我们当前的系统无法使用属性导出xml元素。系统仅创建块和成员。我们虽然用一个元素块替代了一个替代,然后使用XSLT将“dummy”元素转换为具有第一个子元素值的真实元素和基于其他子元素的属性。
原始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完成此操作吗?
答案 0 :(得分:0)
执行任务的模板应执行以下操作:
另一个问题是如何处理命名空间。
stylesheet
标记必须包含cbc
的名称空间声明。
我在这里使用了一个虚拟名称,用你自己的名字替换它。
所以整个脚本可能如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cbc="urn:dummy">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/block/members">
<xsl:variable name="id1" select="member[1]/@id"/>
<xsl:variable name="val1" select="member[1]"/>
<xsl:element name="cbc:{$id1}">
<xsl:for-each select="subsequence(member,2)">
<xsl:attribute name="{@id}" select="."/>
</xsl:for-each>
<xsl:value-of select="$val1"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
对于您的输入,此脚本会生成:
<cbc:InvoiceTypeCode xmlns:cbc="urn:dummy" listID="UNCL1001" listAgencyID="6">380</cbc:InvoiceTypeCode>
不同之处在于它包含xmlns:cbc
声明,但是这一点
由于正确的XML格式化,因此是必需的。