如何在XSLT 1.0中迭代IDREFS值?

时间:2015-07-23 16:30:04

标签: xml xslt xslt-1.0

我有一个使用IDREFS字段的xml。我需要提取这些id以将它们放入自己的元素中。

这是我认为我需要的基本结构,但我不知道在select函数中使用什么。

<xsl:template match="node_With_IDREFS_field">
   <xsl:for-each select="EACH ID IN @idrefsField">
      <xsl:element name="newElement">
        <xsl:attribute name="ref"><xsl:value-of select="THE IDREF"/></xsl:attribute>
      </xsl:element>
   </xsl:for-each>
   <!-- keep rest of content -->
   <xsl:apply-templates select="@*|node()"/>
</xsl:template>

所以来自这个节点

<node_With_IDREFS_field idrefsField="id1 id2"/>

结果将是

<node_With_IDREFS_field>
  <newElement ref="id1"/>
  <newElement ref="id2"/>
</node_With_IDREFS_field>

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您需要标记化 idrefsField属性的值。 XSLT 1.0没有本机tokenize()函数,因此您需要调用递归命名模板来为您执行此操作:

<xsl:template match="node_With_IDREFS_field">
    <xsl:copy>
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="@idrefsField"/>
        </xsl:call-template>
    </xsl:copy>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="' '"/>
    <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token">
            <newElement ref="{$token}"/>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>

或者,如果您的处理器支持它,您可以使用EXSLT str:tokenize()扩展功能。

答案 1 :(得分:0)

你可以试试这个:

<xsl:template match="node_With_IDREFS_field">
    <xsl:element name="node_With_IDREFS_field">
        <xsl:for-each select="tokenize(@idrefsField,' ')">
            <xsl:element name="newElement">
                <xsl:attribute name="ref">
                    <xsl:value-of select="."/>
                </xsl:attribute>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
</xsl:template>