如何使用xsl创建xml的动态节点名称?

时间:2017-07-19 06:12:51

标签: xml xslt xslt-1.0

我是xsl字段的新手。我有以下xml格式。

 <root>
    <docs>
      <doc>
      <actor_name_1>aaa</actor_name_1>
     <url_1>dddd</url_1>
     </doc>
    <doc>
     <actor_name_2>bbb</actor_name_2>
     <url_2>dddd</url_2>
    </doc>
    <doc>
       <actor_name_3>ccc</actor_name_3>
      <url_3>dddd</url_3>
    </doc>
    </docs>
    </root>

我希望在xslt中获得具有动态值numberic(如1,2等)的<actor_name_>个节点的值。喜欢

<xsl:for-each select="//root/docs/doc">
<xsl:value-of select="actors_name_">position()</xsl:value-of>
<xsl:value-of select="url_">position()</xsl:value-of>
</xsl:for-each> 

输出将是......

 Actor 1 aaaa  url 1 ddddd
 Actor 2 bbb   url 2 ddddd
 Actor 3 ccc   url 3 sss

请帮帮我。如何获得节点的动态值?

2 个答案:

答案 0 :(得分:0)

问题并不完全清楚。如果 - 看起来 - 你想要生成一个以制表符分隔的文本文件作为输出,你可以简单地做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

<xsl:template match="/root">
    <xsl:for-each select="docs/doc">
        <xsl:text>Actor </xsl:text>
        <xsl:value-of select="position()" />
        <xsl:text>&#9;</xsl:text>
        <xsl:value-of select="*[1]" />
        <xsl:text>&#9;</xsl:text>
        <xsl:text>url </xsl:text>
        <xsl:value-of select="position()" />
        <xsl:text>&#9;</xsl:text>
        <xsl:value-of select="*[2]" />
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应用于给定的示例,结果将是:

Actor 1 aaa url 1   dddd
Actor 2 bbb url 2   dddd
Actor 3 ccc url 3   dddd

答案 1 :(得分:-1)

您可以使用starts-with()功能检查节点名称。以下代码段可帮助您获取<actor_name_*><url_*>个节点的所有值。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" encoding="utf-8" />
    <xsl:strip-space elements="*" />
    <xsl:template match="/">
        <xsl:for-each select="//root/docs/doc">
            <xsl:variable name="index" select="position()" />
            <xsl:variable name="actorName" select="./*[starts-with(local-name(), 'actor_name_')]" />
            <xsl:variable name="url" select="./*[starts-with(local-name(), 'url_')]" />
            <xsl:value-of select="concat('Actor ', $index, ' ', $actorName, ' url ', $index, ' ', $url, '&#10;')" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

同样如@michael建议的那样,请检查在节点在同一父节点重复的节点(即<doc>)中将数字附加到节点的要求,并且编号不是必需的。