使用xslt从tei文档xml创建表

时间:2013-06-03 17:30:30

标签: xml html5 xslt

我有这样的XML:

<body>
      <div type="capitolo">
          <div n="7" type="pag">
            <head>Prologo</head>
            <p>
               Le tenebre stavano avanzando.
            </p>
            <p>
                <said rend="pre(«) post(»)">Meglio Rientrare.</said> <name type="gar">Gared</name> osservò i boschi attorno a 
                loro farsi più oscuri. <said rend="pre(«) post(»)">I bruti sono morti.</said>
            </p>
            <p>
               <said rend="pre(«) post(»)">Da quando hai paura dei morti?</said> C'era l'accenno di un sorriso sui lineamenti di 
                ser <name type="way">Waymar Royce</name>.
            </p>
            <p>
               <name type="gar">Gared</name> non raccolse. Era un uomo in età, oltre i cinquanta, e di e di nobili ne aveva visti andare 
                e venire molti. <said rend="pre(«) post(»)">Ciò che è morto resta morto</said>         disse <said rend="pre(«) post(»)">e noi non 
                dovremmo averci niente a che fare.</said>
            </p>
            <p>
               <said rend="pre(«) post(»)">Che prova abbiamo che sono davvero morti?</said> chiese <name type="way">Royce</name> a bassa voce.
            </p>
            <p>
               <said rend="pre(«) post(»)"><name type="will">Will</name> li ha visti. Come prova, a me basta.</said>
            </p>
            <p>
               <name type="will">Will</name> sapeva che prima o poi l'avrebbero trascinato nella discussione. Aveva sperato che accadesse dopo, 
                piuttosto che prima. <said rend="pre(«) post(»)">Mia madre diceva che i morti non parlano</said> s'intromise.
            </p>
            <p>
                <said rend="pre(«) post(»)">Davvero, <name type="will">Will</name>?</said> rispose <name type="way">Royce</name>. 
                <said rend="pre(«) post(»)">E' la stessa cosa che mi diceva la mia balia. Mai credere a quello che si sente vicino alle tette di una donna. 
                C'è sempre da imparare, perfino dai morti.</said>
            </p>
            <p>
                La foresta piena d'ombre rimandò echi della voce di ser <name type="way">Waymar</name>. Troppi echi, troppo forti e definiti.</p>
            <p>
                <said rend="pre(«) post(»)">Ci aspetta una lunga cavalcata</said> insistè <name type="gar">Gared</name> 
                <said rend="pre(«) post(»)"> Otto giorni, forse nove. E sta calando la notte.</said>
            </p></div></body>

我必须用XSLT创建一个html表,其中

第1列:对于每个“name”标签,我已经考虑了不同的@types标签名称的值(如果类型是新的时间,请不要写另一个时间名称)

第2列:对于在该行中选择的类型,我们可以找到@type

的所有@n

你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

欢迎使用Stack Overflow!

一些建议。如果您显示当前正在尝试运行的代码,那么通常可以获得有关Stack Overflow问题的更好答案。 (如果您还没有编写任何代码,Stack Overflow的大多数读者会认为您只是希望其他人为您编写代码,他们会忽略您的问题或者因为懒惰而责备您。这意味着如果您没有代码,因为你不知道如何继续,你需要非常仔细地提出你的问题。)Stack Overflow FAQ on asking good quesitons值得一读并给出好的建议。 Eric Raymond和Rick Moen撰写的文章"How to ask questions the smart way"也很有帮助。

首先,您可能希望使用key属性而不是type属性来区分name元素指定的个人。

然后,如果您不确定如何处理XSLT问题,请尝试将其分解为更小的问题。

  • 首先尝试使用文本“观看此空间”生成HTML表格的样式表。

    您的XSLT将在某处发布一个模板,该模板会发出包含一行的表所需的HTML元素。

  • 然后尝试为输入中的每个name元素创建一行。 (这不是你想要的,但是,因为它会有很多次出现的名字条目,但它比“观察这个空间”更接近,所以它是进步。)

    您的XSLT将在某处(可能在body的模板中)有一个模板,用于发出HTML table元素,而name的一个模板会为该事件发出一个表行name

  • 然后尝试考虑一种方法来制作每个不同的名称,或者更确切地说,每个不同的key(或type)属性在表格中只出现一次。在XSLT 2.0中,函数distinct-values()在此连接中很有用;在XSLT 1.0中,通常的方法是使name元素仅在它是具有键值的第一个元素时才生成表行。您可以在相应模板的match模式中或test元素的xsl:choose/xsl:when中使用XPath表达式来测试给定元素是否是同类中的第一个。

    检查给定name元素是否是第一个元素或者不是第一个元素的天真方法有时会很慢。加快速度的常用方法是使用XSLT key函数和一种称为Muenchian Grouping的技术(在Web上搜索它;你会发现很多命中)。如果你是XSLT的新手,Muenchian Grouping很难理解,所以如果天真的方法能够快速满足你当前的需求,我会建议你不要理会它 - 也就是说,如果你不花很多钱希望XSLT运行得更快的时间。

    根据您的操作方式,您的样式表现在只有name的单个模板,其中xsl:choose可以执行一项操作,如果它是第一次出现的键,另一种是如果它是不是,它将为第一次出现的案例提供一个模板,为非出事件案例提供一个模板。

  • 最后,让样式表生成一个完整的使用给定名称的地方列表。执行此操作的简单方法是在模板中使用select上的xsl:apply-templates属性,以便第一次出现每个名称密钥。

如果您不熟悉XSLT,则可能无法执行上述任何一个步骤。尝试一下,尽你所能,并询问Stack Overflow,显示代码,说明您是如何尝试解决问题的。祝你好运。