2012-07-26 68 views
0

如何获取xslt中元素的值。想我这样的XML,检查元素在xslt中具有值

<comp> 
<link ref=1>1997</link> 
<link ref=2><?LINK 2008?></link> 
</comp> 

我需要这样的输出,

<comp> 
    <link ssref=1/><num>1997</num> 
    <link ssref=2/><num>2008</num> 
</comp> 

如果链接值我需要得到该值,如果有这样的<?LINK 2008?>我只需要一年从。我用下面的xsl,但它不工作。

<xsl:template match ="link"> 
<xsl:element name ="{local-name(.)}"> 
    <xsl:attribute name ="sshref"> 
    <xsl:value-of select ="@ref"/> 
    </xsl:attribute> 
    </xsl:element> 
<xsl:if test="text()"> 
    <xsl:element name ="num"> 
    <xsl:value-of select ="link"/> 
    </xsl:element> 
</xsl:if> 
</template> 

我知道这个xsl错误,我只是张贴了一些参考。 在此先感谢。

回答

3

首先,您的XML格式不正确,因为属性应该用撇号或引号括起来,但我猜测这可能是一个简单的错字。

至于具体的问题是一个处理指令,所以你的xsl:if检查文本()将不会选择它。

,你做<xsl:value-of select="link" />,因为你目前的情况下已经是链接元素,所以这是寻找另一种链接元素,它是当前一个的孩子你还要一个问题。你可能只是想希望做这样的事情

<xsl:value-of select="." /> 

所以,你可以重新写你的模板,像这样

<xsl:template match="link"> 
    <xsl:element name="{local-name(.)}"> 
     <xsl:attribute name="sshref"> 
      <xsl:value-of select="@ref"/> 
     </xsl:attribute> 
     <xsl:if test="text()|processing-instruction()"> 
      <xsl:element name="num"> 
       <xsl:apply-templates select="text()|processing-instruction()"/> 
      </xsl:element> 
     </xsl:if> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="processing-instruction()"> 
    <xsl:value-of select="."/> 
</xsl:template> 

然而,值得注意的是它往往是更好地避免使用xsl:如果元素,并且使用模板匹配的力量来代替。改用此替代XSLT。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="link[text()|processing-instruction()]"> 
     <link> 
     <num> 
      <xsl:apply-templates select="text()|processing-instruction()"/> 
     </num> 
     </link> 
    </xsl:template> 

    <xsl:template match="link/@ref"> 
     <xsl:attribute name="ssref"> 
     <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="processing-instruction()"> 
     <xsl:value-of select="."/> 
    </xsl:template> 

    <xsl:template match="@*|node()[not(self::processing-instruction())]"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

当应用于以下XMK

<comp> 
    <link ref="1">1997</link> 
    <link ref="2"><?LINK 2008?></link> 
</comp> 

以下是输出:

<comp> 
    <link sshref="1"> 
     <num>1997</num> 
    </link> 
    <link sshref="2"> 
     <num>2008</num> 
    </link> 
</comp> 

请注意,没有必要使用的xsl:元素,除非你想有一个动态命名元素。

+0

+1,尽管您的XSLT可以简化一点。看到我的答案。 – Tomalak 2012-07-26 11:19:40

1

你的XML是格式不正确,应该是这样的:

<comp> 
    <link ref="1">1997</link> 
    <link ref="2"><?LINK 2008?></link> 
</comp> 

,然后你可以使用下面的XSLT以得到你想要的结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <xsl:element name="comp"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="comp/link"> 
    <xsl:element name="{local-name(.)}"> 
     <xsl:attribute name="sshref"><xsl:value-of select="@ref"/></xsl:attribute> 
    </xsl:element> 
    <xsl:if test="text()|processing-instruction()"> 
     <xsl:element name="num"> 
     <xsl:apply-templates select="text()|processing-instruction()"/> 
     </xsl:element> 
    </xsl:if> 
    </xsl:template> 
    <xsl:template match="processing-instruction()"> 
    <xsl:value-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 
2

最简单的XSLT转换你可以看起来像这样

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="link/text() | link/processing-instruction()"> 
    <num><xsl:value-of select="normalize-space()" /></num> 
    </xsl:template> 

    <xsl:template match="link/@ref"> 
    <xsl:attribute name="ssref"><xsl:value-of select="."/></xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

它转换

<comp> 
<link ref="1">1997</link> 
<link ref="2"><?LINK 2008?></link> 
</comp> 

进入期望的结果。

<comp> 
<link ssref="1"><num>1997</num></link> 
<link ssref="2"><num>2008</num></link> 
</comp> 
+0

+1为最佳答案。 – 2012-07-26 12:09:55