创建具有唯一名称的元素

时间:2014-03-21 15:23:56

标签: xml xslt

我有以下情况:

我的根文档中将有以下多个标记。

<imagelist>
...
<imgp-src>0020104314-01-1.jpg</imgp-src>
<img-src>0020104314-01-2.jpg</img-src>
<img-src>0020104314-01-3.jpg</img-src>
<imgp-src>0020104314-01-4.jpg</imgp-src>
...
</imagelist>

无论源标记(img或imgp)

,我都需要以下结果
<img_url1>0020104314-01-1.jpg</img_url1>
<img_url2>0020104314-01-2.jpg</img_url2>
<img_url3>0020104314-01-3.jpg</img_url3>
<img_url4>0020104314-01-4.jpg</img_url4>

我尝试使用for-each循环和position函数来创建新元素。我在每一次尝试中都失败了。

请注意,标记可以以img或imgp开头。 我需要用顺序标识符命名结果元素。 我可以重命名该值,但似乎无法重命名该元素。

有人能指出我正确的方向。

如果这是一个反复出现的问题,我会提前道歉。我以为我之前已经看过这个问题,但似乎无法找到答案。

谢谢。

2 个答案:

答案 0 :(得分:2)

使用类似

的方法
<xsl:template match="imagelist">
  <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="imagelist/*">
  <xsl:element name="img_url{position()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

答案 1 :(得分:1)

如果您删除空格,可以使用position()

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="imgp-src | img-src">
        <xsl:element name="img_url{position()}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

这假设您在imagelist中没有其他元素。如果你这样做,他们也将被计算在内,你的编号将会有所不同。使用<xsl:number>更安全,因为您可以准确选择要计算的节点(并且不必使用strip-space):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output indent="yes"/>

    <xsl:template match="imgp-src | img-src">
        <xsl:variable name="number">
            <xsl:number count="imgp-src | img-src"/>
        </xsl:variable>
        <xsl:element name="img_url{$number}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>