2016-09-21 136 views
3

我需要执行XML XSLT转换。我对此很陌生,并且阅读了很多教程,但遇到了一些对我而言有挑战性的问题,希望有人能指引我朝着正确的方向前进。XSLT转换

我有两个元件,例如:

<linum class="topic/linum secondAtt/secondVal">Blah</linum> 
<linum class="topic/linum">Blah</linum> 

如果亚麻类属性具有第二值,我必须添加另一个属性,以使用该属性的第二值该元素。如果它只有一个,我会保持原样。

所以输出为上述两个输出将是:

<linum class="topic/linum secondAtt/secondVal" newAttribute="secondVal">Blah</linum> 
<linum class="topic/linum">Blah</linum> 

我希望我已经很好地解释了这一点,如果没有希望,因为只有第一个元素是通过添加新的属性改变了我变清与第二个值。

我很感谢我给予的任何帮助!

+0

究竟做“具有第二值”是什么意思?我在两个方面都只看到一个价值。 –

+0

第一个元素class value =“topic/linum secondAtt/secondVal” 第二个元素class value =“topic/linum” 第一个元素有两个值,主题linum和secondAtt/secondVal。第二个元素只有一个,主题/ linum。 如果元素有两个值,我需要获得第二个值的第二部分,并将其作为新属性添加到同一元素,如我的输出示例中所示 – HelpMeWithXSLT

+0

是否可以有第三个“值”?如果是,在这种情况下结果应该如何? –

回答

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> 
+0

感谢您对迈克尔的回应,非常感谢。今天我会试试这个,并在有机会时报告。 – HelpMeWithXSLT

+0

这就像一个魅力,感谢迈克尔! – HelpMeWithXSLT