我试图在多年后回到XSL / XSLT并需要一些帮助来理解我收到的一些XSL作为示例。我想要转换的基于TEI的XML文件具有以下原理结构:
<text>
<body>
<div>
<div type="text">
<ab>
<lg type="text-de">
<l>TEXT</l>
...
</lg>
</ab>
</div>
<div type="text">
<ab>
<lg type="text-en">
<l>TEXT</l>
...
</lg>
</ab>
</div>
</div>
</body>
</text>
我有一个XSL片段,我想用它来转换上面的文件。我看到的XSL看起来像这样:
<xsl:template match="tei:div">
SOME HTML CODE
<div class="text-de">
<xsl:apply-templates select="tei:lg[(@type='text-de')]"/>
</div>
<div class="text-en">
<xsl:apply-templates select="tei:lg[(@type='text-en')]"/>
</div>
</xsl:template>
我认为预期的HTML输出很明确,但如果您需要我解释一下,请告诉我。我想要实现的是,两个不同的文本块被插入到生成的HTML的不同位置的两个不同元素中。但是,当我运行上面的XSLT时,没有选择任何文本块。如果有任何解释让我理解本例中select属性的性质,我将不胜感激。
答案 0 :(得分:0)
lg
元素未处理,因为它们不是div
元素的子节点,而是它们位于ab
元素内部。因此,您需要分别使用正确的名称空间前缀ab/lg
选择<xsl:apply-templates select="tei:ab/tei:lg[@type='text-de']"/>
。
这是一个更完整的示例,输入XML为
<text xmlns="http://www.tei-c.org/ns/1.0">
<body>
<div>
<div type="text">
<ab>
<lg type="text-de">
<l>TEXT</l>
...
</lg>
</ab>
</div>
<div type="text">
<ab>
<lg type="text-en">
<l>TEXT</l>
...
</lg>
</ab>
</div>
</div>
</body>
</text>
和XSLT
<xsl:stylesheet
version="2.0"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="tei">
<xsl:template match="tei:div[@type = 'text']">
SOME HTML CODE
<div class="text-de">
<xsl:apply-templates select="tei:ab/tei:lg[@type='text-de']"/>
</div>
<div class="text-en">
<xsl:apply-templates select="tei:ab/tei:lg[@type='text-en']"/>
</div>
</xsl:template>
</xsl:stylesheet>
输出
SOME HTML CODE
<div class="text-de">
TEXT
...
</div><div class="text-en"/>
SOME HTML CODE
<div class="text-de"/><div class="text-en">
TEXT
...
</div>
因此,使用正确的匹配模式和路径处理元素。我确信结果不是您想要的最终结果,但您需要添加更多模板以获得对HTML的干净转换。如果您仍有问题,请发布新问题或编辑现有问题,显示您想要的结果样本。