xslt 将层次结构转换为新层次结构

问题描述 投票:0回答:1

嘿嘿! 我是 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>
xml xslt tei
1个回答
0
投票

如果所有模板规则都做同样的事情,您可以缩短它。例如,如果大多数时候您只想重命名元素,那么您可以定义重命名映射并将其应用于所有元素:

<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 个,这让事情变得不必要的复杂。

© www.soinside.com 2019 - 2024. All rights reserved.