使用XSLT在XML中附加重复的元素名称?

时间:2012-03-08 22:00:05

标签: xml xslt

如果我有一个如下所示的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的数量因属性而异)?

2 个答案:

答案 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>

解释

  1. 覆盖picture元素的 identity rule

  2. {{3}的name属性中使用 AVT position() 功能}

  3. 使用 xsl:element