首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XSLT1.0将第一个街道标记替换为<p property="v:street-address">

如何使用XSLT1.0将第一个街道标记替换为<p property="v:street-address">
EN

Stack Overflow用户
提问于 2013-02-10 19:18:40
回答 2查看 192关注 0票数 0

xsl:apply-templates指令:

代码语言:javascript
复制
<xsl:if test="$item/tcm:Content/em:Office/em:Address">
    <address>
        <xsl:apply-templates mode="renderhtml" select="$item/tcm:Content/em:Office/em:Address/node()" />
    </address>
</xsl:if>

产生:

代码语言:javascript
复制
<p>
    My Office Address
    <br />XXXX Road
    <br />XXXX District
    <br />XXXX, XXXX.
    <br />PO Box XXXX
</p>

现在,我希望将生成的html存储在一个变量中,然后调用另一个模板,将第一个<p>元素替换为<p property="v:street-address">,这样最终结果将是:

代码语言:javascript
复制
<p property="v:street-address">
    My Office Address
    <br />XXXX Road
    <br />XXXX District
    <br />XXXX, XXXX.
    <br />PO Box XXXX
</p>

请推荐!!

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-10 22:08:50

在XSLT1.0中,只有在使用支持the node-set() function的处理器时,才能捕获输出并将模板应用于该输出。假设你是,你可以这样做:

代码语言:javascript
复制
<xsl:if test="$item/tcm:Content/em:Office/em:Address">
    <address>
      <xsl:variable name="addressHtml">
        <xsl:apply-templates mode="renderhtml" 
                             select="$item/tcm:Content/em:Office/em:Address/node()" />
      </xsl:variable>
      <xsl:apply-templates select="msxsl:node-set($addressHtml)" 
                           mode="adjustAddressHtml" />
    </address>
</xsl:if>

...

  <xsl:template match="@* | node()" mode="adjustAddressHtml" name="Identity">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="adjustAddressHtml" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/" mode="adjustAddressHtml">
    <xsl:if test="p">
      <xsl:call-template name="Identity" />
    </xsl:if>
    <xsl:if test="not(p)">
      <xsl:call-template name="StartingP" />
    </xsl:if>
  </xsl:template>

  <xsl:template match="/p[1]" mode="adjustAddressHtml" name="StartingP">
    <p property="v:street-address">
      <xsl:apply-templates select="@* | node()" mode="adjustAddressHtml" />
    </p>
  </xsl:template>
票数 1
EN

Stack Overflow用户

发布于 2013-02-11 01:46:25

如果没有源XML文档,就很难给出完整的答案,但是通常可以避免两遍转换的需要。

相反,代码可以像一样简单

某处:

代码语言:javascript
复制
<xsl:apply-templates mode="renderhtml"
         select="$item/tcm:Content/em:Office/em:Address/>

然后:

代码语言:javascript
复制
 <xsl:template match="em:Address" mode="renderhtml">
  <address>
      <xsl:apply-templates mode="renderhtml" select="node()" />
  </address>
 </xsl:template>

 <xsl:template match="em:Address/node()" mode="renderhtml">
    <p>
     <xsl:if test="position() = 1">
      <xsl:attribute name="property">v:street-address</xsl:attribute>
     </xsl:if>
       <!-- The code that generates this:
        My Office Address
        <br />XXXX Road
        <br />XXXX District
        <br />XXXX, XXXX.
        <br />PO Box XXXX
         -->
    </p>
 </xsl:template>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14797139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档