2009-01-04 50 views
2

我有一個看起來像這樣列出具體的子元素中給定的屬性

<SEARCHRESULTS> 
    <FUNCTION name="BarGraph"> 
    <PARAMETER name="numList"></PARAMETER> 
    <PARAMETER name="maxValue"></PARAMETER> 
    <CODE>Some code</CODE> 
    </FUNCTION> 
</SEARCHRESULTS> 

一些XML代碼,我想提取每個函數參數的名稱列表,到目前爲止,我已經得到了以下XSL代碼

<xsl:for-each select="SEARCHRESULTS/FUNCTION"> 
    <ROW> 
    <COL><DATA><xsl:value-of select="@name" /></DATA></COL> 
    <COL><DATA><xsl:value-of select="PARAMETER/@name" /></DATA></COL> 
    <COL><DATA><xsl:value-of select="CODE" /></DATA></COL> 
    </ROW> 
</xsl:for-each> 

哪個當然返回第一個參數的名稱以及函數名和代碼。

我想要一個文本字符串中的函數的所有參數的列表。返回分隔是最好的,但只要所有的名字都在字符串中,我可以稍後解析它。

我可以規範化目標數據庫中的參數記錄 - 但我不打算,我只是需要它們用於顯示目的,所以我不想付出太多努力。這就是爲什麼我'尋找一個簡單的文本字符串。

我認爲可能有某種方式只是把星號或東西。如果沒有,我會創建一個變量,並添加其他的for-each建立一個字符串 - 但它只是好像應該有一個更簡單的方法

生成的XML應該像

<ROW> 
    <COL><DATA>BarGraph</DATA></COL> 
    <COL><DATA>numList;maxValue</DATA></COL> 
    <COL><DATA>Some code</DATA></COL> 
</ROW> 

凡「 ;」在第二列可能是一個回車或其它字符,我可以指定

回答

3

嘗試用第二的foreach:

<xsl:template match="/"> 
<xsl:for-each select="SEARCHRESULTS/FUNCTION"> 
    <ROW> 
    <COL> 
     <DATA> 
     <xsl:value-of select="@name" /> 
     </DATA> 
    </COL> 
    <COL> 
     <DATA> 
     <xsl:for-each select="PARAMETER"> 
      <!-- separate the names by a semicolon (do not insert a semicolon the first time --> 
      <xsl:if test="position() > 1"> 
      <xsl:text>;</xsl:text> 
      </xsl:if> 
      <xsl:value-of select="@name" /> 
     </xsl:for-each> 
     </DATA> 
    </COL> 
    <COL> 
     <DATA> 
     <xsl:value-of select="CODE" /> 
     </DATA> 
    </COL> 
    </ROW> 
</xsl:for-each> 

+0

我已經打上這個答案,因爲接受的,因爲它是從字面上我接受和使用的一個。我沒有使用其他的xsl:apply-templates解決方案,因爲我試圖儘可能簡單地理解xsl – 2009-01-07 16:19:29

1
<xsl:template match="PARAMETER"> 
    <xsl:value-of select="@name" /> 
    <xsl:text> </xsl:text> 
</xsl:template> 

替換當前的代碼

<COL><DATA><xsl:value-of select="PARAMETER/@name" /></DATA></COL> 

<COL><DATA><xsl:apply-templates select="PARAMETER"/></DATA></COL> 
+0

代碼在哪裏,它會在初始? – 2009-01-04 17:35:59

2

產生所需的結果的一種可能的變換是以下

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<!--            --> 
    <xsl:template match="/*"> 
     <TABLE> 
     <xsl:apply-templates select="*"/> 
     </TABLE> 
    </xsl:template> 
<!--            --> 
    <xsl:template match="FUNCTION"> 
     <ROW> 
     <COL><xsl:value-of select="@name"/></COL> 
     <COL><xsl:apply-templates select="PARAMETER"/></COL> 
     <COL><xsl:apply-templates select="CODE"/></COL> 
     </ROW> 
    </xsl:template> 
<!--            --> 
<xsl:template match="PARAMETER"> 
<xsl:param name="pDelim" select="';'"/> 
<xsl:value-of select= 
"concat(@name, 
     substring($pDelim, 
        1 div not(position() = last())) 
        )"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉化是在原始XML文檔施加:

<SEARCHRESULTS> 
    <FUNCTION name="BarGraph"> 
     <PARAMETER name="numList"></PARAMETER> 
     <PARAMETER name="maxValue"></PARAMETER> 
     <CODE>Some code</CODE> 
    </FUNCTION> 
</SEARCHRESULTS> 

的通緝結果生產

<TABLE> 
    <ROW> 
     <COL>BarGraph</COL> 
     <COL>numList;maxValue</COL> 
     <COL>Some code</COL> 
    </ROW> 
</TABLE> 

請注意<xsl:template>它匹配PARAMETER有一個參數$pDelim,它可以用來指定哪些字符(或字符串)作爲參數名稱的列表分隔符來使用。此分隔符的默認值設置爲「;」。

2

xsl:apply-templates將成爲您的答案。它簡單而優雅。

<xsl:template match="FUNCTION/PARAMETER"> 
    <xsl:if test="position() > 1"> 
     <xsl:text>; </xsl:text> <!-- This is the delimiter --> 
    </xsl:if> 
    <xsl:value-of select="@name" /> 
</xsl:template> 

然後代替<xsl:value-of select="PARAMETER/@name" />的你讓這樣的:

<xsl:apply-templates select="PARAMETER" /> 
相關問題