背景
我的问题的更一般的版本是最近发布的 ,但由于岗位的质量,没有收到任何答复。 这里是我的尝试!
我有我想要转换以下XML结构
前处理XML
<schema>
<!-- element to be imbedded -->
<element name="tryCatch.catch">
<complexType>
<complexContent>
<extension base="escalateContainer">
<attribute name="var" type="_var" />
</extension>
</complexContent>
</complexType>
</element>
<complexType name="tryCatch">
<complexContent>
<extension base="scriptElement">
<sequence>
<element name="try" type="escalateContainer" />
<element name="catch" type="tryCatch.catch" minOccurs="0" />
<element name="finally" type="escalateContainer" minOccurs="0" />
</sequence>
</extension>
</complexContent>
</complexType>
</schema>
......进入结构如下:
后XSLT的结构
<schema>
<complexType name="tryCatch">
<complexContent>
<extension base="scriptElement">
<sequence>
<element name="try" type="escalateContainer" />
<!-- Change here! -->
<element name="tryCatch.catch" minOccurs="0">
<complexType>
<complexContent>
<extension base="escalateContainer">
<attribute name="var" type="_var" />
</extension>
</complexContent>
</complexType>
</element>
<element name="finally" type="escalateContainer" minOccurs="0" />
</sequence>
</extension>
</complexContent>
</complexType>
</schema>
过程概述
基本上,我只是想
- 复制一切
然后,找到所有
element
为a的complexType
有一个.
在它们的类型 (由建设-我已经确保这种模式工作interally在我的XML)。 我比赛的简化版本是:complexType.element.type = element.name
最后,更换相应的全局元素的元素。 如果正在替换奖励点元素的属性也被复制。
我至今
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="schema">
<xsl:for-each select="element">
<xsl:variable name="self" select="current()" />
<xsl:variable name="name" select="@name" />
<xsl:for-each select="/schema/complexType//element[@type=$name]">
<xsl:copy-of select="$self" />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
我想我要到正确的开始 - 所有内容复制与身份模板,然后再处理什么,我想改变。 问题是,我的第二个模板只返回复制的元素! 本场比赛似乎工作的伟大,我只是失去了所有我想要保留其他内容。