草庐IT

xml - 将两个 XSLT 模板应用于同一元素的最佳方式

coder 2024-07-01 原文

我有这样的 XML:

<data>
    <admin id="abc">
        <type>one</type>
        <!-- <detail/> might appear here but the content is unrelated to <detail/> below -->
    </admin>
    <detail id="def">
        <name>Bob</name>
    </detail>
</data>

然后我有这样的 XSLT:

<xsl:template match="/data/admin">
    Admin content
</xsl:template>

<xsl:template match="/data/detail">
    Some content to appear before ALL types.  This id is <xsl:value-of select="@id"/>
    <xsl:choose>
        <xsl:when test="/data/admin/type='one'>
            Content for type One only.  Your name is <xsl:value-of select="name"/>
        </xsl:when>
        <xsl:when test="/data/admin/type='two'>
            Content for type Two only.  Your name is still <xsl:value-of select="name"/>
        </xsl:when>
        <xsl:otherwise>
            Content if the type is not set or set to an unknown value
        </xsl:otherwise>
    </xsl:choose>
    Some content to appear after ALL types.  This id is <xsl:value-of select="@id"/>
</xsl:template>

因为 <xsl:choose/>很大,我想把它分成不同的文件 - 每个条件一个 - 和 <xsl:include/>将它们放入主文档中。

我遇到的问题是 <xsl:include/>要求每个包含的文件都包含模板,我不能包含原始数据。所以我只剩下这些选择:

  • 在每个包含的文件中,使用<xsl:template match="/data/detail"/> - 这会覆盖上面的父模板,因此我必须将“所有类型”的数据复制并粘贴到每个文件中。这不好,因为数据重复。
  • 在每个包含的文件中,使用类似于<xsl:template match="/data/admin/type='one'"/> 的内容然后调用<xsl:apply-templates select="/data/admin/type"/> .这是行不通的,因为在“管理内容”模板中,我将无意中为 child 创建一个模板实例 <type/>我不想要的节点。
  • 将每个内容 block 定义为命名模板,然后在我的 <xsl:choose/> 中称呼每个人的名字。当 XSLT 无需我明确命名它就能选择正确的模板时,这似乎有点不整洁。

有没有更简洁的方法可以实现这一目标?

输出应该是这样的:

Admin content
Some content to appear before ALL types.  This id is def
Content for type One only.  Your name is Bob
Some content to appear after ALL types.  This id is def

最佳答案

您可以只使用两个不同的模板来匹配两个不同的 XPath,每个模板对应一种类型,如下所示:

<xsl:template match="/data[admin/type='one']/detail">
    <!-- Type one specific transform -->
</xsl:template>
<xsl:template match="/data[admin/type='two']/detail">
    <!-- Type two specific transform -->
</xsl:template>

这些模板中的每一个都可以在自己的文件中,并且每个文件都包含在内。

关于xml - 将两个 XSLT 模板应用于同一元素的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20232916/

有关xml - 将两个 XSLT 模板应用于同一元素的最佳方式的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  7. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  10. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

随机推荐