2012-08-08 50 views
1


考慮以下XML:
如何從XML元素中去除文本,重新排列文本並將其與XSLT連接起來?

<root> 
    <contrib contrib-type="author"> 
    <name> 
     <last-name>Simpson</last-name> 
     <first-name>Bart</first-name> 
    </name> 
    </contrib> 

    <contrib contrib-type="author"> 
    <name> 
     <last-name>Zoidberg</last-name> 
     <first-name>Dr.</first-name> 
    </name> 
    </contrib> 
</root> 

...我怎樣才能把這些元素的含量得到這個輸出?

<Authors contrib-type="author">Bart Simpson</Authors> 
<Authors contrib-type="author">Dr. Zoidberg</Authors> 




我試圖用  <last-name>  ,並 用一個空格隔開內容來連接的  <first-name>  內容。

此外,也沒有必要的  Authors  任何子元素(除暴安良的  <name>  ,  <first-name>  ,如果可能的話  <last-name>  元素)。



這是XSL我到目前爲止( 這是不工作):

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

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

     <!-- Authors --> 
     <xsl:template match="contrib[@contrib-type='author']"> 
      <Authors> 
       <xsl:apply-templates select="@*|node()"/> 
       <xsl:value-of select = "concat(given-names, surname)" /> 
      </Authors> 
     </xsl:template> 

</xsl:stylesheet> 


到目前爲止,我能夠在  <contrib>  元素轉換爲  <Authors>  ,但我不能連接或剝離其子元素...

回答

1

試試這個:

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

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

     <!-- Authors --> 
     <xsl:template match="contrib[@contrib-type='author']"> 
      <Authors contrib-type="{@contrib-type}"> 
       <xsl:value-of select = "concat(name/first-name, ' ', name/last-name)" /> 
      </Authors> 
     </xsl:template> 

</xsl:stylesheet> 

我希望這將有助於

+0

謝謝@Ankur!漂亮而簡單,完美。 – 2012-08-08 16:47:37

+0

歡迎您,如果您有任何問題,請告訴我,我更樂意回答儘可能簡單和複雜的問題。 :) – 2012-08-08 16:52:01

2

嘗試這樣簡單的事情,因爲這:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="/"> 
    <root> 
     <xsl:apply-templates select="/root/contrib"/> 
    </root> 
</xsl:template> 
<!-- Authors --> 
<xsl:template match="contrib[@contrib-type='author']"> 
    <Authors> 
     <xsl:copy-of select="@*"/> 
     <xsl:value-of select="name/first-name"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="name/last-name"/> 
    </Authors> 
</xsl:template> 
</xsl:stylesheet> 
+0

嗯,這個使用'',不知道的是,由於@mabroukb很有趣。 – 2012-08-08 16:48:59

1

除非我錯過了點,改變你的模板,作者對以下應該工作:

<!-- Authors --> 
<xsl:template match="contrib[@contrib-type='author']"> 
    <Authors> 
     <xsl:apply-templates select="@*"/> 
     <xsl:value-of select = "concat(normalize-space(name/first-name/text()), 
             ' ', 
             normalize-space(name/last-name/text()))" /> 
    </Authors> 
</xsl:template> 

輸出:

<root> 
    <Authors contrib-type="author">Bart Simpson</Authors> 
    <Authors contrib-type="author">Dr. Zoidberg</Authors> 
</root> 
+0

完美的作品,謝謝@nonnb的幫助。在這種情況下,「normalize-space」究竟做了什麼? – 2012-08-08 16:50:40

+1

啊我看到了 - 它正在從text()中刪除前導空白和尾隨空白。這很有趣,不知道你可以用'text()'來訪問「內部XML」。 – 2012-08-08 16:53:30

相關問題