XSLT: создание строки из вложенных узлов - PullRequest
0 голосов
/ 16 марта 2011

У меня есть этот XML с вложенными узлами, я хотел бы построить из него строку. Как я могу это сделать?

образец узла 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

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Это похоже на дерево результатов парсера.Эта таблица стилей:

<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 голосов
/ 16 марта 2011

Я не могу проверить прямо сейчас, но я думаю, это должно быть так:

<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>
...