2012-07-26 96 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