首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块化xslt?

模块化xslt?
EN

Stack Overflow用户
提问于 2011-12-30 23:50:19
回答 3查看 486关注 0票数 2

如何在xslt转换中模块化一组重复的输出?例如,我有类似下面的代码(伪代码)。

代码语言:javascript
复制
<foreach "path">
  <if "count(/subPath) = 0">
    <a><value-of "x"/></a>
    <b><value-of "y"/></b>
    <c></c>
  </fi>
  <else>
    <foreach "subPath">
      <a><value-of "../x"/></a>
      <b><value-of "../y"/></b>
      <c><value-of "z"/></c>
    </foreach>
  </else>
</foreach>

并希望如下所示:

代码语言:javascript
复制
<foreach "path">
  <if "count(/subPath) = 0">
     <?/>
  </fi>
  <else>
    <foreach "subPath">
       <?/>
    </foreach>
  </else>
</foreach> 
<?>
   <a><value-of "../x"/></a>
   <b><value-of "../y"/></b>
   <c><value-of "z"/></c>
</?>

我要寻找的是什么结构?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-31 00:50:57

I.伪码翻译

您的伪代码将1:1转换为这个XSLT转换

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:for-each select="/t/m/n/p">
       <xsl:choose>
        <xsl:when test="not(subPath)">
        <a><xsl:value-of select="x"/></a>
        <b><xsl:value-of select="y"/></b>   
      </xsl:when>
      <xsl:otherwise>
       <xsl:for-each select="subPath">
        <a><xsl:value-of select="../x"/></a>
        <b><xsl:value-of select="../y"/></b>
        <c><xsl:value-of select="z"/></c>   
       </xsl:for-each>
      </xsl:otherwise>
       </xsl:choose>
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

在此XML文档上应用时(问题中未提供此类文档!):

代码语言:javascript
复制
<t>
 <m>
  <n>
   <p>
     <x>1</x>
     <y>2</y>
     <subPath>
       <z>3</z>
     </subPath>
     <subPath>
       <z>4</z>
     </subPath>
   </p>
  </n>
 </m>
</t>

生成所需的正确结果

代码语言:javascript
复制
<a>1</a>
<b>2</b>
<c>3</c>
<a>1</a>
<b>2</b>
<c>4</c>

II.重构

这是一个重构后的等价转换,它不使用任何 xsl:for-each 或任何显式条件指令

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="p[not(subPath)]" name="processP">
   <xsl:param name="pNode" select="."/>
   <a><xsl:value-of select="$pNode/x"/></a>
   <b><xsl:value-of select="$pNode/y"/></b>
 </xsl:template>

 <xsl:template match="p/subPath">
   <xsl:call-template name="processP">
    <xsl:with-param name="pNode" select=".."/>
   </xsl:call-template>
   <c><xsl:value-of select="z"/></c>    
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当应用于相同的文档时(如上),同样会产生相同的正确结果

代码语言:javascript
复制
<a>1</a>
<b>2</b>
<c>3</c>
<a>1</a>
<b>2</b>
<c>4</c>

注意到

  1. Templates/pattern匹配,以避免使用显式条件指令。这是最强大的、特定于XSLT的设计模式。每个模板都与它要处理的节点完全匹配,在完全必要的conditions.
  2. The下,第一个模板的代码也会被重用,给它一个名字,这样它就可以被显式地调用了。
  3. 这样就避免了代码重复。
票数 3
EN

Stack Overflow用户

发布于 2011-12-30 23:52:45

您可能正在寻找named templates

票数 0
EN

Stack Overflow用户

发布于 2011-12-30 23:52:59

您正在寻找可以用<call-template>调用的模板(<template>)。有关详细信息,请访问http://www.w3.org/TR/xslt#named-templates

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8681250

复制
相关文章

相似问题

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