XSLT替换可变元素文本

时间:2016-12-19 05:48:04

标签: xslt

我有一个看起来像这样的示例文档

<document>
   <memo>
       <to>Allen</to>
       <p>Hello! My name is <bold>Josh</bold></p>
       <p>It's nice to meet you <bold>Allen</bold>. I hope that we get to meet up more often.</p>
       <from>Josh</from>
   <memo>
</document>

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:company="http://my.company">
    <xsl:output method="html"/>

    <xsl:variable name="link" select="company:generate-link()"/>

    <xsl:template match="/document/memo">
        <h1>To: <xsl:value-of select="to"/></h1>

        <xsl:for-each select="p">
            <p><xsl:apply-templates select="node()" mode="paragraph"/></p>
        </xsl:for-each>

        <xsl:if test="from">
            <p>From: <strong><xsl:value-of select="from"/></strong></p>
        </xsl:if>

        <xsl:copy-of select="$link"/>
    </xsl:template>

    <xsl:template match="bold" mode="paragraph">
        <b><xsl:value-of select="."/></b>
    </xsl:template>

    <xsl:template match="text()" mode="paragraph">
        <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

并且变量 link 包含以下示例节点:

<a href="#doAction"></a>

当我复制变量 链接 时,它会正确打印出节点(但显然没有任何文本)。我想将其插入到文档中并使用XSLT替换文本。例如,文本可以是:

View all of <xsl:value-of select="/document/memo/from"/>'s documents.

所以生成的文档看起来像是:

<h1>To: Allen</h1>
<p>Hello! My name is <b>Josh</b></p>
<p>It's nice to meet you <b>Allen</b>. I hope that we get to meet up more often.</p>
<from>Josh</from>
<a href="#doAction">View all of Josh's documents.</a>

我一直在网上搜索如何做到这一点,但我找不到任何东西。如果有人可以提供帮助,我会非常感激!

谢谢, 大卫。

1 个答案:

答案 0 :(得分:1)

您还没有说过哪个XSLT处理器也没有显示该扩展函数的代码以允许我们理解它返回的内容但是根据您的注释说它返回一个节点,您通常可以使用模板进一步处理它如果您使用<xsl:apply-templates select="$link"/>然后编写模板

<xsl:template match="a[@href]">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    View all of <xsl:value-of select="$main-doc/document/memo/from"/>'s documents.
  </xsl:copy>
</xsl:template>

在您声明全局变量<xsl:variable name="main-doc" select="/"/>的地方,您应该能够转换从函数返回的节点。