如果我有一个如下所示的XML文件:
<properties>
<property>
<picture>http://example.com/image1.jpg</picture>
<picture>http://example.com/image2.jpg</picture>
<picture>http://example.com/image3.jpg</picture>
<picture>http://example.com/image4.jpg</picture>
<picture>http://example.com/image5.jpg</picture>
</property>
</properties>
我如何将其转换为每个图片网址元素的唯一位置,如下所示:
<properties>
<property>
<picture1>http://example.com/image1.jpg</picture1>
<picture2>http://example.com/image2.jpg</picture2>
<picture3>http://example.com/image3.jpg</picture3>
<picture4>http://example.com/image4.jpg</picture4>
<picture5>http://example.com/image5.jpg</picture5>
</property>
</properties>
我是否正确假设每个元素必须包含相同数量的元素,即使某些元素包含空值(图片URL的数量因属性而异)?
答案 0 :(得分:3)
使用count(preceding-sibling::*)+1
获取当前元素的索引。
完整示例:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- identity transform -->
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
<!-- override for picture elements to rename element -->
<xsl:template match="picture">
<xsl:element name="{name()}{count(preceding-sibling::*)+1}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
这个简短的转换(没有使用轴):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="picture">
<xsl:element name="picture{position()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<properties>
<property>
<picture>http://example.com/image1.jpg</picture>
<picture>http://example.com/image2.jpg</picture>
<picture>http://example.com/image3.jpg</picture>
<picture>http://example.com/image4.jpg</picture>
<picture>http://example.com/image5.jpg</picture>
</property>
</properties>
生成想要的正确结果:
<properties>
<property>
<picture1>http://example.com/image1.jpg</picture1>
<picture2>http://example.com/image2.jpg</picture2>
<picture3>http://example.com/image3.jpg</picture3>
<picture4>http://example.com/image4.jpg</picture4>
<picture5>http://example.com/image5.jpg</picture5>
</property>
</properties>
解释:
覆盖picture
元素的 identity rule 。
在 {{3}的name
属性中使用 AVT 和 position()
功能} 强>
使用 xsl:element
。