【发布时间】:2014-07-31 22:48:21
【问题描述】:
背景故事是,这是一个正在升级到 ColdFusion 11 的旧 ColdFusion 应用程序。我已经确定我现在看到的主题错误是因为 XSLT 1.0 处理器被允许忽略此错误并通过以下方式“恢复”忽略 xsl:attribute 指令。 (谢谢ref Michael Kay。)
我无法完全理解解决方案,所以这里有一些简化的代码:
XML
<?xml version="1.0" encoding="UTF-8"?>
<Organization>
<Subscriber>
<data>
<struct>
<var name='DEPENDENT'>
<array length='1'>
<struct>
<var name='PROVIDER'>
<struct>
<var name='PROVIDERCODE'>
<string>A4321</string>
</var>
<var name='TYPE'>
<string>Primary Care Provider</string>
</var>
</struct>
</var>
</struct>
</array>
</var>
</struct>
</data>
</Subscriber>
</Organization>
您可能会认为这是旧的WDDX format。下面的 XSLT 将这种丑陋的、深度嵌套的格式转换为更干净/更简单的 XML 格式。
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="var">
<xsl:choose>
<xsl:when test="translate(@name, 'TEX', 'tex') = 'text'">
<xsl:value-of select="./string"/>
</xsl:when>
<xsl:when test="translate(@name, 'TYPE', 'type') = 'type'">
<xsl:attribute name="type">
<xsl:value-of select="./string"/>
</xsl:attribute>
</xsl:when>
<xsl:when test="child::array">
<xsl:apply-templates/>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')}">
<xsl:apply-templates/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="struct">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="array">
<xsl:param name="parentname" select="translate(../@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')"/>
<xsl:for-each select="struct">
<xsl:element name="{$parentname}">
<xsl:if test="./var[translate(@name, 'RELATIONSHPCD', 'relationshpcd') = 'relationshipcode']">
<xsl:attribute name="relationshipcode"><xsl:value-of select="./var[translate(@name, 'RELATIONSHPCD', 'relationshpcd') = 'relationshipcode']"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:template match="string|number">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="boolean">
<xsl:value-of select="@value"/>
</xsl:template>
<xsl:template match="Subscriber">
<subscriber>
<xsl:apply-templates/>
</subscriber>
</xsl:template>
<xsl:template match="Organization">
<organization>
<xsl:apply-templates/>
</organization>
</xsl:template>
</xsl:stylesheet>
很遗憾,WDDX 名称属性的大小写不一致,因此可以使用翻译命令来解决这个问题,但不幸的是,这会使代码变得更复杂。
预期输出
<?xml version="1.0" encoding="UTF-8"?>
<organization>
<subscriber>
<dependent>
<provider type="Primary Care Provider">
<providercode>A4321</providercode>
</provider>
</dependent>
</subscriber>
</organization>
问题
问题在于,在上面的示例中,可能会在遇到“type”节点之前将“providercode”添加到“provider”节点,导致无法创建“属性节点”在包含元素的子元素之后" error.o
请注意,为了清楚起见,我已经简化了上面的示例。大约有六个具有特定“名称”属性的“var”节点应作为属性插入,而其他简单的节点则直接作为节点添加。
对于如何解决此问题的任何帮助将不胜感激。
提前致谢。
保罗
【问题讨论】:
标签: xml xslt coldfusion xalan wddx