XSLT 转换

3
我可以帮您进行XML XSLT转换的工作。虽然我是新手,但已经阅读了很多教程,但有一个比较具有挑战性,希望有人能指点我正确的方向。
例如,我有两个元素:
<linum class="topic/linum secondAtt/secondVal">Blah</linum>
<linum class="topic/linum">Blah</linum>

如果linum类属性有第二个值,我必须使用该属性的第二个值向该元素添加另一个属性。如果它只有一个,则保留原样。
因此,上述两种情况的输出将是:
<linum class="topic/linum secondAtt/secondVal" newAttribute="secondVal">Blah</linum>
<linum class="topic/linum">Blah</linum>

我希望我已经解释得很好了,如果没有,希望我的输出是清晰的,只有第一个元素通过添加新属性来转换第二个值。我非常感谢任何给予我的帮助!

“有第二个值”是什么意思?我在两个值中只看到一个单一的值。 - michael.hor257k
第一个元素的类值为“topic/linum secondAtt/secondVal”,第二个元素的类值为“topic/linum”。如果元素有两个值,我需要获取第二个值的第二部分,并将其作为新属性添加到同一元素中,如我的输出示例所示。 - HelpMeWithXSLT
可以有第三个“值”吗?如果是,这种情况下结果应该是什么? - michael.hor257k
在DITA中,每个元素都有其自己的class属性,在整个DTD或模式中是唯一的。因此,“linum”元素具有两个不同的@class属性并不是一种常见情况。如果您是DITA处理样式表的新手,最好参考DITA规范“2.5.3.6类属性规则和语法”(http://docs.oasis-open.org/dita/dita/v1.3/os/part3-all-inclusive/archSpec/base/specialization-class-attribute.html#classatt)。或者您应该查阅您的专业化DTD(或模式),了解其中如何定义class属性。(因为“linum”不是标准的DITA元素。) - Toshihiko Makita
直接在xsl:template/@match中引用元素名称并不是推荐的方式。您可以查看GitHub DITA-OT插件中的许多示例,了解它们在DITA样式表中如何处理。(https://github.com/dita-ot/dita-ot/tree/develop/src/main/plugins) - Toshihiko Makita
1个回答

1
以下内容适用于您的示例,其中“class”属性不包含超过两个以空格分隔的值:
XSLT 1.0
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="linum[contains(@class, ' ')]">
    <linum class="{@class}" newAttribute="{substring-after(substring-after(@class, ' '), '/')}">
        <xsl:apply-templates/>
    </linum>
</xsl:template>

</xsl:stylesheet>

谢谢你的回复,Michael。非常感谢。我会在今天尝试一下,并在有机会时报告结果。 - HelpMeWithXSLT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接