我有这样的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你能帮帮我吗?
答案 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,显示代码,说明您是如何尝试解决问题的。祝你好运。