【问题标题】:Converting a block to XML element with Value AND XML attributes using XSLT使用 XSLT 将块转换为具有值和 XML 属性的 XML 元素
【发布时间】: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:

&lt;cbc:InvoiceTypeCode listAgencyID="6" listID="UNCL1001"&gt;380&lt;/cbc:InvoiceTypeCode&gt;

有人可以帮忙解决所需的 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。

标签: xml xslt


【解决方案1】:

执行任务的模板应执行以下操作:

  • 保存第一个成员id属性(变量id1)。
  • 保存第一个成员的内容(变量val1)。
  • 创建一个名为 cbc:id1 变量内容的新元素。
  • 为每个成员,除了第一个,创建一个属性:
    • 名称取自其id属性,
    • 取自其内容的值。
  • 到目前为止,我们已经完成了属性。
  • 最后一部分是用内容填充这个元素的值 val1 变量。

另一个问题是如何处理命名空间。 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 格式,因此是必需的。

【讨论】:

  • 非常感谢您的帮助。根据您的输入,我设法创建了预期的输出。
  • 好的。如果您将我的答案标记为“已选择”,那就太好了(然后应用程序会奖励声誉积分)。
猜你喜欢
  • 2010-10-13
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多