我正在将TEI转换为XHTML。只有当xml:lang
属性存在于当前节点时,我才需要将它转换为lang
属性。我尝试了一些笨拙的东西,比如:
<xsl:template match="tei:p">
<xsl:element name="p">
<xsl:attribute name="lang">
<xsl:value-of select="./@xml:lang"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
…但我想坚持最佳做法。如何简单地将xml:lang
属性转换为lang
属性?当然,如果它不存在,就不要使用它。
我在模板中添加了著名的标识规则(此处为据迈克尔·凯说),但它什么也不做:
<!-- Identity Rule -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="@xml:lang">
<xsl:attribute name="lang">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
我想我不太明白这条规则。
我想用它来做任何标签,比如:
<p xml:lang="en">
<seg xml:lang="fr">XYZ</seg> otherwise English.
</p>
预期产出:
<p lang="en">
<seg lang="fr">XYZ</seg> otherwise English.
</p>
发布于 2016-05-10 12:45:54
您的标识模板还应该处理子节点,否则它将在第一个匹配节点处停止:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@xml:lang">
<xsl:attribute name="lang">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
发布于 2016-05-10 12:44:30
如果您有一个与tei:p
匹配的现有模板,那么这将优先于标识模板。您的当前模板执行<xsl:apply-templates />
,但这相当于<xsl:apply-templates select="node()" />
。它不是处理属性。
您需要做的是用xsl:apply-templates
替换当前的xsl:apply-templates
,但是选择@xml:lang
属性,允许相关的模板匹配它。
<xsl:template match="tei:p">
<p>
<xsl:apply-templates select="./@xml:lang"/>
<xsl:apply-templates/>
</p>
</xsl:template>
因此,如果@xml:lang
不存在,则不会选择任何属性,也不会创建属性。
https://stackoverflow.com/questions/37138772
复制相似问题