我已经成功地创建了一个 XSLT 模板来复制一些元素,改变一些元素的名称,从一个 XML 文件到另一个。
但是,我不知道如何获取元素并将它们移动到 XML 结构的不同部分。
我想转换这个 XML:
<Hosts>
<Clusters>
<Cluster>
<Nodes>
<WindowsHost/>
</Nodes>
</Cluster>
</Clusters>
</Hosts>
到:
<Hosts>
<WindowsHosts>
<WindowsHost/>
</WindowsHosts>
</Hosts>
我当前工作的 XSLT 包含:
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
...然后重复模板,例如:
<xsl:template match="/Hosts/Clusters/Cluster/Nodes/WindowsHost">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Hosts/Clusters/Cluster/Nodes/WindowsHost/SomeElement">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
等等。每个要复制的元素都有自己的模板,因为并非所有元素都被复制并且某些元素名称已更改。但是我只成功地更改了元素名称,而不是完整的 XPath。
任何帮助,将不胜感激。
保罗
非常感谢您的回复。但我认为我的例子太简单了,试图说清楚。
我现有的 XSLT 为需要从一个 XML 复制到另一个 XML 的每个元素都有一个模板,因此有很多模板(几乎 1000 个),并且 XSLT 文件的开头确保默认情况下任何元素都不会发生任何事情。长话短说,我尝试了您回答中的技术但没有成功,可能是因为情况与我向您展示的情况不完全一样。
复制元素有三种情况:
- 照原样复制
- 复制但更改元素名称
- 复制到架构中的不同位置
现有的 XSLT 文件适用于 #1 和 #2。这是#3我无法上班。这是更多的 XSLT 文件
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/SAN/ClientProfile">
<!-- copy element as is (working) -->
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/SAN/ClientProfile/Name">
<!-- copy element but change its name (working) -->
<CompanyName>
<xsl:apply-templates/>
</CompanyName>
</xsl:template>
<xsl:template match="/SAN/EQLHosts/WindowsClusters/Cluster/ClusterNodes/WindowsHost">
<!-- copy to different part of schema (not working) -->
<WindowsHost>
<xsl:apply-templates/>
</WindowsHost>
</xsl:template>
/SAN/EQLHosts/WindowsClusters/Cluster/ClusterNodes/WindowsHost
所以,我想改成/SAN/EQLHosts/WindowsHosts/WindowsHost
. 该元素的所有子元素的处理方式与已被复制的元素相同。
我希望我的澄清很清楚。请让我知道此信息是否会改变您的答案,或者我是否只是过于密集。
保罗