2009-01-04 22 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" /> 
相关问题