2011-10-25 32 views
2

还有另外一个类别实验室测验我需要使用XSLT 1.0比较position()返回值和参数值的帮助。我有下面这段简单的XML ...XSLT 1.0 - 如何将位置()返回值与参数值进行比较

<Providers> 
    <Company> 
     <Name>Alpha</Name> 
    </Company> 

    <Company> 
     <Name>Beta</Name> 
    </Company> 

    <Company> 
     <Name>Omega</Name> 
    </Company> 
</Providers> 

而且我想在一个参数来传递一个数值,指定哪个节点级插入一个名为评级喜欢这个新元素...

<Providers> 
     <Company> 
       <Name>Alpha</Name> 
     </Company> 

     <Company> 
       <Name>Beta</Name> 
       <Rating>Good</Rating> 
     </Company> 

     <Company> 
       <Name>Omega</Name> 
     </Company> 
</Providers> 

这里是我的XSLT ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

<xsl:param name="nodeNumber">2</xsl:param> 


<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 


<xsl:template match="Providers"> 
    <xsl:copy> 
     <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 


<xsl:template match="Company[ position() = 2 ]"> 
    <xsl:copy> 
     <xsl:copy-of select="@*|node()"/> 
     <Rating>Good</Rating> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

而不是硬编码到第二个节点...

<xsl:template match="Company[ position() = 2 ]"> 

我想要做这样的比较,所以它使用的参数值...

<xsl:template match="Company[ position() = $nodeNumber ]"> 

,但我得到一个错误,如果XSLT 1.0 ...

c:\ msxsl.exe providers.xml providers.xsl 

Error occurred while compiling stylesheet 'providers.xsl'. 

Code: 0x80004005 
Variables may not be used within this expression. 

Company[ position() = -->$nodeNumber <--] 

它工作正常,如果XSLT是2.0 ...

c:\ altovaxml.exe /xslt2 providers.xsl /in providers.xml 

<?xml version="1.0" encoding="UTF-8"?> 
<Providers> 
     <Company> 
       <Name>Verizon</Name> 
     </Company> 
     <Company> 
       <Name>Sprint</Name> 
       <Rating>Good</Rating> 
     </Company> 
     <Company> 
       <Name>ATT</Name> 
     </Company> 
</Providers> 

我需要使用XSLT 1.0。非常感谢你的时间和精力...

回答

3
<xsl:template match="Company"> 
    <xsl:copy> 
    <xsl:copy-of select="@*|node()"/> 
    <xsl:if test="(count(preceding-sibling::Company) + 1) = $nodeNumber"> 
     <Rating>Good</Rating> 
    </xsl:if> 
    </xsl:copy> 
</xsl:template> 
+0

嘿,非常感谢你,它的工作!感谢您花时间阅读我的问题并发布答案! –

+2

你已经接受了答案,但它是错误的。在匹配模式的谓词中调用position()测试节点相对于其同名兄弟的位置,而模板主体中的position()是在相应的应用模板中选择的节点集合中的位置呼叫。 –

+0

@MichaelKay有用,请更改为'(count(prior-sibling :: Company)+ 1)= $ nodeNumber'。 –

相关问题