【问题标题】:collapsed for-each won't work折叠 for-each 不起作用
【发布时间】:2014-10-10 01:42:04
【问题描述】:

我很难用 xsl 和 xml 做一个折叠的 for-each。 这是我的 xml 文件:

<a>
<b>
    <c name="namec1">
        <d name="named1">value1</d>
        <d name="named2">value2</d>
        <d name="named3">value3</d>
        <d name="named4">value4</d>
    </c>
    <c name="namec1">
        <d name="named1">value5</d>
        <d name="named2">value6</d>
        <d name="named3">value7</d>
        <d name="named4">value8</d>
    </c>
    <c name="namec1">
        <d name="named1">value9</d>
        <d name="named2">value10</d>
        <d name="named3">value11</d>
        <d name="named4">value12</d>
    </c>
</b>
</a>

这就是我想要的:

namec: [namec1, namec2, namec3]
named: [value1, value5, value9]
named: [value2, value6, value10]
named: [value3, value7, value11]
named: [value4, value8, value12]

这是我的 xsl 代码:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:variable name="index" select="." />
<html>
<body>
namec: [
    <xsl:for-each select="a/b">    
        <xsl:choose>
            <xsl:when test="position()=1">
                <xsl:value-of select='c/@name'/>
            </xsl:when>
            <xsl:otherwise>
                , <xsl:value-of select='d/@name'/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
    ]   

    <xsl:for-each select="a/b">
        <xsl:if test="position()=1">
            <xsl:for-each select="c/d">
                named: <xsl:value-of select="@name" />,    
                data: [
                <xsl:for-each select="$index/a/b/c">
                    <xsl:value-of select="d" />,
                </xsl:for-each>
                ]
            </xsl:for-each>
        </xsl:if>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

第一个 for-each 没问题 但我真的不明白为什么第二个崩溃的 for-each 不起作用 我什么都试过了,但我是新手…… 有可能吗? 提前致谢!

【问题讨论】:

  • 1. 每个c 组是否有相同的d 成员? 2. 你确定这是你想要的输出格式吗?你有周围的 html 标签;这不会以您在 HTML 中显示的方式显示。
  • 每个c成员的d名称相同,但值不同。不用担心 html 标签,在我的情况下它们无关紧要。这里的困难是我想要一个看起来像这样的列表:namedn: [values of all namedn] for n = {1,...,n}
  • 我只是在问这张桌子是否“常规”。如果是,那么这是一个转置的问题 - 看看你是否可以为你做这个工作:stackoverflow.com/questions/4410084/…
  • 很好的答案。我正在寻找一种方法来做到这一点!我告诉你我是否设法在我的情况下应用它。应该不是问题

标签: xml xslt foreach


【解决方案1】:

我尝试将this answer 应用于我的案例,它确实有效:

xml:

<table>
  <tr name="date1">
    <td name="var1">A11</td>
    <td name="var2">A12</td>
    <td name="var3">A13</td>
    <td name="var4">A14</td>
    <td name="var5">A15</td>
  </tr>
  <tr name="date2">
    <td name="var1">A21</td>
    <td name="var2">A22</td>
    <td name="var3">A23</td>
    <td name="var4">A24</td>
    <td name="var5">A25</td>
  </tr>
  <tr name="date3">
    <td name="var1">A31</td>
    <td name="var2">A32</td>
    <td name="var3">A33</td>
    <td name="var4">A34</td>
    <td name="var5">A35</td>
  </tr>
</table>

还有xsl:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
categories: [
<xsl:for-each select="table/tr">    
        <xsl:choose>
            <xsl:when test="position()=1">
                '<xsl:value-of select='@name'/>'
            </xsl:when>
            <xsl:otherwise>
                , '<xsl:value-of select='@name'/>'
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
    ]   



 <xsl:for-each select="table/tr[1]/td">
  <xsl:variable name="vRowPos" select="position()"/>
   <xsl:for-each select="/table/tr">
    <xsl:variable name="vColPos" select="position()"/>
    <xsl:choose>
        <xsl:when test="position()=1">
            name: '<xsl:value-of select="/table/tr[$vColPos]/td[$vRowPos]/@name" />',
            data: ['<xsl:value-of select="/table/tr[$vColPos]/td[$vRowPos]" />'
        </xsl:when>
        <xsl:otherwise>
            , '<xsl:value-of select="/table/tr[$vColPos]/td[$vRowPos]" />'
        </xsl:otherwise>
    </xsl:choose>
   </xsl:for-each>]
 </xsl:for-each>
 </xsl:template>
 </xsl:stylesheet>

它返回给我:

categories: ['date1', 'date2', 'date3']   

name: 'var1',
data: ['A11', 'A21', 'A31']

name: 'var2',
data: ['A12', 'A22', 'A32']

name: 'var3',
data: ['A13', 'A23', 'A33']

name: 'var4',
data: ['A14', 'A24', 'A34']

name: 'var5',
data: ['A15', 'A25', 'A35']

【讨论】:

  • 使用“文本”作为输出方法,如果那是您的最终目的地。此外,使用&lt;xsl:text&gt; 元素输出文字文本是一种很好的做法;这样你就不会输出周围的空白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多