2011-03-16 57 views
0

我有這個帶有嵌套節點的XML,我想從中構建一個字符串。我怎樣才能做到這一點?XSLT:從嵌套節點構建一個字符串

示例XML節點:

<ND FID="22" FN="&gt;" FC="Compare" DT="Greater Than" DTY="BOOL" 
    CID="-1" PS="1" PF="ROOT" DN="True" GB="False" LK="False" PT="2"> 
    <ND FID="176" FN="Add_Months" FC="Date and Time" DT="AddMonths" 
     DTY="DATETIME" CID="-1" PS="1" PF="&gt;" DN="False" GB="False" 
     LK="False" PT="2"> 
     <ND FID="117" FN="TodayMinusDays" FC="Date and Time" 
      DT="TodayMinusDays" DTY="DATETIME" CID="-1" PS="1" 
      PF="Add_Months" DN="False" GB="False" LK="False" PT="2"> 
      <ND FID="-1" FN="" FC="" DT="2" DTY="INTEGER" CID="5" 
       PS="1" PF="TodayMinusDays" DN="False" GB="False" 
       LK="False" PT="3"/> 
     </ND> 
     <ND FID="-1" FN="" FC="" DT="10" DTY="INTEGER" CID="3" 
      PS="2" PF="Add_Months" DN="False" GB="False" LK="False" 
      PT="3"/> 
    </ND> 
    <ND FID="-1" FN="" FC="" DT="DTTM" DTY="DATETIME" CID="4" PS="2" 
     PF="&gt;" DN="False" GB="False" LK="False" PT="4"/> 
</ND> 

預期輸出:

Add_Months(TodayMinusDays(2), 10) > DTTM 

提前感謝!

+0

根本不清楚你期望的結果是什麼,應該實施什麼規則/約束/邏輯。不是說沒有名爲'DTTM'的元素/屬性?請編輯你的問題,這次定義好。 – 2011-03-16 13:18:18

回答

1

它看起來像一個解析器結果樹。這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="ND[@FID > 0][@DN='True']"> 
     <xsl:apply-templates select="*[1]"/> 
     <xsl:value-of select="concat(' ',@FN,' ')"/> 
     <xsl:apply-templates select="*[2]"/> 
    </xsl:template> 
    <xsl:template match="ND[@FID > 0][@DN='False']"> 
     <xsl:value-of select="concat(@FN,'(')"/> 
     <xsl:for-each select="*"> 
      <xsl:if test="position()!=1"> ,</xsl:if> 
      <xsl:apply-templates select="."/> 
     </xsl:for-each> 
     <xsl:text>)</xsl:text> 
    </xsl:template> 
    <xsl:template match="ND[0 > @FID]"> 
     <xsl:value-of select="@DT"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

Add_Months(TodayMinusDays(2) ,10) > DTTM 

注意:操作,功能和數據的規則。

+0

謝謝大家的回答。 :) – Ianthe 2011-03-17 14:33:34

+0

@ user661951:不客氣。 – 2011-03-17 15:05:33

0

我現在不能測試,但我想它應該是這樣的:

<xsl:apply-templates select="ND" /> 

<xsl:template match="ND"> 
    <xsl:choose> 
    <xsl:when test="@FN!=''"> 
     <xsl:value-of select="@FN" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="@DT" /> 
    </xsl:otherwise> 
    </xsl:choose> 
    (
    <xsl:apply-templates select="ND" /> 
) 
</xsl:template>