嘿嘿! 我是 xslt 的新手,所以请原谅愚蠢的问题和错误:)
我有一个 xml 层次结构,想将其转换为新的层次结构。这很好用,但是有没有更简单/更优雅的方法?
旧:
<choice>
<sic>misericordia</sic>
<corr type="erratum">misericordiam</corr>
</choice>
新:
<app>
<lem>misericordia</lem>
<rdg witt="erratum">misericordiam</rdg>
</app>
工作但很长xslt:
<xsl:template match="choice">
<app>
<xsl:apply-templates/>
</app>
</xsl:template>
<xsl:template match="sic">
<lem>
<xsl:apply-templates/>
</lem>
</xsl:template>
<xsl:template match="corr[@type='erratum']">
<rdg wit="{@type}">
<xsl:apply-templates/>
</rdg>
</xsl:template>
如果所有模板规则都做同样的事情,您可以缩短它。例如,如果大多数时候您只想重命名元素,那么您可以定义重命名映射并将其应用于所有元素:
<xsl:variable name="renamings" select="map{
'choice':'app',
'sic':'lem'
'corr':'rdg'}"/>
<xsl:template match="*">
<xsl:element name="{$renamings(local-name())}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
然后您可以为任何需要执行更复杂操作的元素定义覆盖模板规则。如果您想要重命名 100 个元素,那么这肯定是一个有用的简化;在我看来,只有 3 个,这让事情变得不必要的复杂。