在我的映射项目中,我有一个基于xml结构的源代码。请注意大写的节点名称和属性值:XSL转换解决方案
<ROOT>
<INPUT>
<NODEA
ATT1="xxx"
ATT2="xxx" />
<NODEB
ATT1="xxx"
ATT2="xxx" />
</INPUT>
</ROOT>
和其他基于此xml的xsd用于目标。注意:小写名称和元素值:
<operation>
<input>
<nodea>
<att1>xxx</att1>
<att2>xxx</att2>
</nodea>
<nodeb>
<att1>xxx</att1>
<att2>xxx</att2>
</nodeb>
</input>
</operation>
我怎样才能得到一个XSL转换,通过树节点,类似这样的分组,与Altova的MapForce的2017年?注意节点意见和变量名:
<xsl:template match="/ROOT">
<operation>
<input>
<xsl:for-each select="INPUT">
<!-- NODEA -->
<xsl:for-each select="NODEA">
<!-- ATT1 -->
<xsl:for-each select="@ATT1">
<xsl:variable name="v_ATT1" select="."/>
<att1>
<xsl:value-of select="string($v_ATT1)"/>
</att1>
</xsl:for-each>
<!-- ATT2 -->
<xsl:for-each select="@ATT2">
<xsl:variable name="v_ATT2" select="."/>
<att2>
<xsl:value-of select="string($v_ATT2)"/>
</att2>
</xsl:for-each>
</xsl:for-each>
<!-- NODEB -->
<xsl:for-each select="NODEB">
<!-- ATT1 -->
...
<!-- ATT2 -->
...
</xsl:for-each>
</xsl:for-each>
</input>
</operation>
</xsl:template>
的Altova的MapForce的创建此不同的解决方案:
<xsl:stylesheet ... >
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="var1_initial" select="."/>
<operation xmlns="...">
<xsl:attribute ...>
<input>
<xsl:for-each select="*[local-name()='ROOT' and namespace-uri()='']">
<xsl:variable name="var2_cur" select="."/>
<att1>
<xsl:value-of select="*[local-name()='INPUT' and namespace-uri()='']/*[local-name()='NODEA' and namespace-uri()='']/@ATT1"/>
</att1>
...
</xsl:for-each>
</input>
</operation>
</xsl:template>
</xsl:stylesheet>
什么是'有用吗?某个元素只能拥有某个特定名称的单个属性(例如'ATT1'),所以我根本不明白'for-each'的内在用处是什么。你的文字说“按树节点分组”,这是什么意思?如果一个'INPUT'可以有几个例如'NODEA'孩子,你想用XSLT 2.0对他们进行分组,你应该简单地处理''。 –
问题不明确。这两个可能的输入是否是同一个转换?或者是一个输入,另一个是预期的输出? –
我认为你是对的,没有必要为属性嵌套for-each。 – Sergio