当节点具有属性class="deleted"
时,我想将节点的值添加到名为text
的属性中。
此输入:
<element class="deleted" >
<span>Example</span>
</element>
应创建此输出:
<element class="deleted" text="<span>Example</span>" /> **Edit**
我使用的.xsl是:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="node()[@class = 'deleted']">
<xsl:copy>
<xsl:attribute name="text">
<xsl:value-of select="child::node()" />
</xsl:attribute>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
并且输出不像它想要的那样:
<element text="Example" class="deleted"><span>Example</span></element>
问题是我不知道如何移除值并将span
标记带入属性text
答案 0 :(得分:1)
删除值:
请不要在复制之后应用模板,而只应在属性上应用模板。
<xsl:template match="node()[@class = 'deleted']">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:attribute name="text">
<xsl:value-of select="child::node()" />
</xsl:attribute>
</xsl:copy>
</xsl:template>
要将值及其标记放在属性中,您几乎需要将其序列化为文本。您可以定义一个负责该模板的模板:
<xsl:template mode="serialize-to-text" match="text()">
<xsl:copy/>
</xsl:template>
<xsl:template mode="serialize-to-text" match="*">
<xsl:value-of select="concat('<', name(), '>')"/>
<xsl:apply-templates mode="serialize-to-text" select="node()" />
<xsl:value-of select="concat('</', name(), '>')"/>
</xsl:template>
并称之为:
<xsl:template match="node()[@class = 'deleted']">
<xsl:copy>
<xsl:attribute name="text">
<xsl:apply-templates mode="serialize-to-text" select="node()" />
</xsl:attribute>
</xsl:copy>
</xsl:template>