我有一个使用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>
感谢您的帮助。
答案 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>