输入xml:
<content>
<link>
<text>sign on</text>
<trackableReference local="/PUBLIC_WEB_URL" title=""/>
</link>
</content>
输出xml:
<content>
<a id="mylink" href="PUBLIC_WEB_URL" title="">sign on</a>
</content>
xslt尝试过的可以正常使用:
1)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="content">
<content>
<xsl:apply-templates/>
</content>
</xsl:template>
<xsl:template match="*[name()='link']">
<a id="mylink">
<xsl:attribute name="href"><xsl:value-of select="trackableReference/@local"/></xsl:attribute>
<xsl:attribute name="title"><xsl:value-of select="trackableReference/@title"/></xsl:attribute>
<xsl:value-of select="text"/>
</a>
</xsl:template>
</xsl:stylesheet>
2)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="content">
<content>
<xsl:apply-templates/>
</content>
</xsl:template>
<xsl:template match="*[name()='link']">
<a id="mylink">
<xsl:attribute name="href">
<xsl:for-each select="child::*">
<xsl:choose>
<xsl:when test="name()='trackableReference'">
<xsl:value-of select="@local"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:for-each select="child::*">
<xsl:choose>
<xsl:when test="name()='trackableReference'">
<xsl:value-of select="@title"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:attribute>
<xsl:for-each select="child::*">
<xsl:choose>
<xsl:when test="name()='text'">
<xsl:value-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</a>
</xsl:template>
</xsl:stylesheet>
但我有一个场景,我必须在模板中创建一些全局变量,其值将根据遍历的子节点动态修改。示例考虑在此方案中修改的模板
<xsl:template match="*[name()='link']">
<xsl:variable name="x1"/>
<xsl:variable name="x2"/>
<xsl:variable name="x3"/>
<xsl:for-each select="child::*">
<xsl:choose>
<xsl:when test="name()='trackableReference'">
<xsl:value-of select="@local"/>
<xsl:value-of select="@title"/>
</xsl:when>
<xsl:when test="name()='text'">
<xsl:value-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<a id="mylink">
<xsl:attribute name="href"><xsl:value-of select="$x1"/></xsl:attribute>
<xsl:attribute name="title"><xsl:value-of select="$x2"/></xsl:attribute>
<xsl:value-of select="$x3"/>
</a>
</xsl:template>
这里
x1
变量应使用从@local
,x2
变量应使用从@title
,x3
变量应使用从'text'
节点中选择的值进行分配。因此,我希望将在顶部声明的这些变量分配给从遍历的子节点中提取的值。我被困在这里,无法前进。
任何人都可以解决此问题。
答案 0 :(得分:0)
不确定为什么必须使用变量,但这是一个例子:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="content">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="link">
<xsl:variable name="x1" select="trackableReference/@local"/>
<xsl:variable name="x2" select="trackableReference/@title"/>
<xsl:variable name="x3" select="text"/>
<a id="mylink" href="{$x1}" title="{$x2}">
<xsl:value-of select="$x3" />
</a>
</xsl:template>
</xsl:stylesheet>
如果你真的不需要变量,你可以这样做:
<xsl:template match="link">
<a id="mylink" href="{trackableReference/@local}" title="{trackableReference/@title}">
<xsl:value-of select="text" />
</a>
</xsl:template>
另外,我注意到你说:
在模板中创建一些值为的全局变量 动态修改
这是不可能的。设置后,变量不能更改值。