2011-03-16 34 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>