XML:
<t>
<ScreenSize>
<Width>1440</Width>
<Height>900</Height>
</ScreenSize>
<ConfigurationHotSpots>
<Rectangle>
<Location>
<X>0</X>
<Y>0</Y>
</Location>
<Size>
<Width>50</Width>
<Height>50</Height>
</Size>
<X>0</X>
<Y>0</Y>
<Width>50</Width>
<Height>50</Height>
</Rectangle>
</ConfigurationHotSpots>
</t>
所需的输出 XML:
<t>
<ScreenSizeWidth>1440</ScreenSizeWidth>
<ScreenSizeWidth>900</ScreenSizeWidth>
<ConfigurationHotSpotsRectangleLocationX>0</ConfigurationHotSpotsRectangleLocationX>
<ConfigurationHotSpotsRectangleLocationY>0</ConfigurationHotSpotsRectangleLocationY>
<ConfigurationHotSpotsRectangleSizeWidth>50</ConfigurationHotSpotsRectangleSizeWidth>
<ConfigurationHotSpotsRectangleSizeHeight>50</ConfigurationHotSpotsRectangleSizeHeight>
<ConfigurationHotSpotsRectangleX>0</ConfigurationHotSpotsRectangleX>
<ConfigurationHotSpotsRectangleY>0</ConfigurationHotSpotsRectangleY>
<ConfigurationHotSpotsRectangleWidth>50</ConfigurationHotSpotsRectangleWidth>
<ConfigurationHotSpotsRectangleHeight>50</ConfigurationHotSpotsRectangleHeight>
</t>
规则:
- 对于已定义节点集中的每个元素(在本例中
<ScreenSize> | <ConfigurationHotSpots>
),请执行以下操作: 处理所有叶后代(即没有子节点的那些),以便创建一个新元素;这个新元素的名称应该是当前节点和无子后代之间所有元素的串联。 - 整个文档中这些“块”的数量是可变的,因此没有手动模板(即,一个只处理 的后代
<ScreenSize>
,一个只处理 的后代<ConfigurationHotSpots>
,等等)
我目前拥有的:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="ScreenSize|ConfigurationHotSpots">
<xsl:apply-templates select="descendant::*[not(*)]" mode="descendants" />
</xsl:template>
<xsl:template match="*" mode="descendants">
<xsl:element name="{concat(name(ancestor::*[not(self::t)]), name())}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
问题似乎是name(ancestor::*[not(self::t)])
部分;它没有做我希望它做的事情(神奇地输出这些元素的名称,一个接一个)。相反,这就是我得到的:
<?xml version="1.0" encoding="UTF-8"?>
<t>
<ScreenSizeWidth>1440</ScreenSizeWidth>
<ScreenSizeHeight>900</ScreenSizeHeight>
<ConfigurationHotSpotsX>0</ConfigurationHotSpotsX>
<ConfigurationHotSpotsY>0</ConfigurationHotSpotsY>
<ConfigurationHotSpotsWidth>50</ConfigurationHotSpotsWidth>
<ConfigurationHotSpotsHeight>50</ConfigurationHotSpotsHeight>
<ConfigurationHotSpotsX>0</ConfigurationHotSpotsX>
<ConfigurationHotSpotsY>0</ConfigurationHotSpotsY>
<ConfigurationHotSpotsWidth>50</ConfigurationHotSpotsWidth>
<ConfigurationHotSpotsHeight>50</ConfigurationHotSpotsHeight>
</t>
提前致谢!