XSLT匹配属性,那么它的元素

在我的源XML,任何元素都可以有@n属性。 如果一个人呢,我处理元素及其所有子项之前要输出。

例如

<line n="2">Ipsum lorem</line> <verse n="5">The sounds of silence</verse> <verse>Four score and seven</verse> <sentence n="3"> <word n="1">Hello</word> <word n="2">world</word> </sentence>

我必须符合“线”,“诗”,“句子”和“词”的模板。 如果任何这些元素都有一个@n价值,我想在任何元素的模板生成前输出。

以上可能走出类似

2 <div class="line">Ipsum lorem</span> 5 <span class="verse">The sounds of silence</span> <span class="verse">Four score and seven</span> 3 <p class="sentence"> 1 <span class="word">Hello</span> 2 <span class="word">world</span> </p>

其中,在“线”,“节”,等等的模板生成的股利,跨度和p元素。

我应该如何看待这个问题? - 匹配属性,然后应用模板到它的父? (你会为语法是什么?)将调用模板在每一个元素的模板的开始? (这是没有吸引力)。别的东西吗? (大概!)

我尝试了一些东西,但无论得到一个无限循环,或没有,或加工属性,然后将其父母的孩子,但不是父本身。

--------------解决方案-------------

这里有一个简单的方法来做到这一点

<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="*/*[@n]">
<xsl:value-of select="concat('
', @n, ' ')"/>

<xsl:apply-templates select="self::*" mode="content"/>
</xsl:template>

<xsl:template match="*/*[not(@*)]">
<xsl:apply-templates select="." mode="content"/>
</xsl:template>

<xsl:template match="line" mode="content">
<div class="line"><xsl:apply-templates/></div>
</xsl:template>

<xsl:template match="verse | word" mode="content">
<span class="{name()}"><xsl:apply-templates mode="content"/></span>
</xsl:template>

<xsl:template match="sentence" mode="content">
<p class="sentence"><xsl:apply-templates/></p>
</xsl:template>
</xsl:stylesheet>

当这种转变施加在提供的XML文档:

<t>
<line n="2">Ipsum lorem</line>
<verse n="5">The sounds of silence</verse>
<verse>Four score and seven</verse>
<sentence n="3">
<word n="1">Hello</word>
<word n="2">world</word>
</sentence>
</t>

通缉,正确的结果产生:

2 <div class="line">Ipsum lorem</div>
5 <span class="verse">The sounds of silence</span>
<span class="verse">Four score and seven</span>
3 <p class="sentence">
1 <span class="word">Hello</span>
2 <span class="word">world</span>
</p>

说明 :适当使用模板模式

为了简化问题,我把映射从XML到HTML元素在文档内的数据结构(可通过文档()函数不带参数)。 现在只需要一个模板需要只在一个地方的@n属性的特殊处理。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<map>
<elt xml="line" html="class"/>
<elt xml="verse" html="span"/>
<elt xml="sentence" html="p"/>
<elt xml="word" html="span"/>
</map>

<xsl:template match="line|verse|sentence|word">
<xsl:if test="@n"><xsl:value-of select="@n"/> </xsl:if>
<xsl:element name="{document()/map/elt[@xml=name()]/@html}">
<xsl:attribute name="class"><xsl:value-of select="name()"/></xsl:attibute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

分类:XSLT 时间:2012-01-01 人气:0
本文关键词: XSLT
分享到:

相关文章

  • 我怎么算后裔:: W:p是一个以上的使用XSLT 2.0吗? 2012-01-01

    我想测试一个条件<xsl:when> . 条件是,我想测试是否后代:: W的计数:p为多个然后只它进入<xsl:when>用于进一步处理. 我该怎么办呢? 请指引我走出利用这个问题<xsl:when> . --------------解决方案------------- 条件是,我想测试是否的计descendant::w:p一个以上的则只有它进入<xsl:when>用于进一步处理. 在这两个XSLT 1.0和XSLT 2.0: <xsl:when tes

  • 如何应用在C#中的XSLT样式表 2012-01-01

    我想用C#XSLT样式表应用到XML文档和输出写入到文件. --------------解决方案------------- 我发现了一个可能的答案在这里: http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63 从文章: XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;

  • 如何一些标签转换到另一个使用XSLT 2012-01-01

    我有以下XML: <p> First level <p> Second level <p> Third level </p> </p> </p> 我想用XSLT模板来改造它,得到以下结果: <b> First level <b> Second level <b> Third level </b> </b> </b> 我想保留原来的结构. 注意文本节点. 我该怎么做

  • 在XSLT,什么也意味着,什么是跨浏览器的解决方案? 2012-01-01

    XSL: <xsl:if test=".[foo or @bar]"> something </xsl:if> 它是测试,如果目标是'富'的标签名称或有一个'酒吧'属性? 它只能在IE浏览器,我想知道是否有错误. 什么是等效的句子,但工程跨浏览器? --------------解决方案------------- <xsl:if test=".[foo or @bar]"> something </xsl:if> 在XS

  • 包括在HTML页面的XSLT样式表 2012-01-01

    我有一些JavaScript,需要一个XSLT适用于Ajax请求的结果. 该XSLT是在一个单独的文件中定义的"transform.xslt" - 什么,包括在我的页面中的XSLT的最佳方法是什么? 是否有可能使用某种<link...元素,或将我需要做一个单独的HTTP请求自己的XSLT? --------------解决方案------------- 我认为你需要使用XMLHttpRequest从服务器加载的样式表,那么你有responseXML的,你可以使用与XSLT转换AP

  • 在XML转换dateand为UTC时区与XSLT 2012-01-01

    我有一个在标准ISO 8601日期格式的XML. 喜欢这个: 2011-11-29T04:15:22-08:00 我想时间转换为UTC,并在使用XSLT以下形式输出日期: 2011-11-29 12点15分22秒 怎样才能做到呢? 提前致谢. --------------解决方案------------- XSLT - 1.0没有日期格式化功能. 因此,你必须与它的工作与文字 - 见相关问题的格式通过XSLT在XML中的日期 其他可能的方法是创建扩展功能(参见@ 0xA3执行在回答同样的问题在M

  • 为您在XSLT CR或LF 2012-01-01

    我有一个输入XML是这样的: <in_xml> <company> <project> ProjNo1 ProjNo2 ProjNo3 </project> </company> </in_xml> 一个简单的XSLT应用到该源,这与项目变量的值写入另一个XML. 在输入XML项目标记有三条线,它可以是一个或多个线(S). 我在看的方式为XSLT来只读第一行,万一有一个以上的,写在输出XML的第一行. 目前XSLT很简单,因为它只是读

  • 如何添加或更换使用XSLT元素 2012-01-03

    我使用XSLT应用配置转换. 我想补充的元素,如果它不存在,或者如果它存在覆盖. 期望的结果: <foo> <bar value="baz" /> </foo> 我可以使用哪些模板有这个输出两路输入 <foo> <bar value="123" /> </foo> 和 <foo> </foo> --------------解决方案------------- 这种转变 :

  • XSLT - 任何XML转换成表格 2012-01-03

    我试图创建一个通用的XSLT文件,将处理任何XML输入这样,我不希望被提及具体的子节点作为XML可以是任何的XSLT. 我不希望XML有一个层次更深任何大于10的子节点. 示例XML: <Client> <LastName>Bill</LastName> <FirstName>Gates</FirstName> <MiddleName/> <Suffix/> <DateOfBirth>30-May-1968&l

  • 什么是最好的Java Web应用框架,顺利使用XML + XSLT? 2012-01-03

    我最近了解了一些关于XML / XSLT和想尝试它在我的web项目. 你会推荐什么框架? 基本上,我想生成将被应用到XSLT样式表在客户端动态XML. 检票是我的第一人选,但它主要是HTML为中心. 没能得到我的想法的工作呢. --------------解决方案------------- 如果你想XSLT样式表要在客户端,以XMLS应用从服务器上,你只需要返回纯XML到客户端(因为你已经写了:)不是相反)接受 <?xml-stylesheet ... ?> 构建嵌入式. 如果你想XSLT文件

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.680 (s). 10 q(s)