gpt4 book ai didi

xslt - 使用 XSLT 的两列表

转载 作者:行者123 更新时间:2023-12-01 05:53:00 25 4
gpt4 key购买 nike

这是我正在处理的 XML 数据的一小部分

<?xml version="1.0" encoding="utf-16"?>
<ScorecardSummary>
<DivisionSummary>
<DivisionName>
<string> SYSTEM</string>
</DivisionName>
<ScorecardSummaryByDivision>
<ScorecardSummaryByKPI>
<Header>
<string>Committed Time of Arrival</string>
<string>Goal</string>
<string>1D</string>
<string>7D</string>
<string>QTD</string>
<string>YTD</string>
<string>YTD Event Cars</string>
</Header>
<Data>
<ScorecardContract>
<TypeName>System</TypeName>
<Goal>68</Goal>
<GoalWarning>64.6</GoalWarning>
<TotalCountYear>1234</TotalCountYear>
<Value1D>79</Value1D>
<Value7D>79.2</Value7D>
<ValueQTD>79.1</ValueQTD>
<ValueYTD>73.3</ValueYTD>
</ScorecardContract>
<ScorecardContract>
<TypeName>AG</TypeName>
<Goal>68</Goal>
<GoalWarning>64.6</GoalWarning>
<TotalCountYear>1111</TotalCountYear>
<Value1D>80.9</Value1D>
<Value7D>78.7</Value7D>
<ValueQTD>78.4</ValueQTD>
<ValueYTD>69.7</ValueYTD>
</ScorecardContract>

这是生成表格的 XSL 的一小部分:

<xsl:template match="ScorecardSummary/DivisionSummary/DivisionName">
<h1>
<xsl:value-of select="current()/string"/>
</h1>
</xsl:template>

<xsl:template match="ScorecardSummaryByDivision">
<xsl:apply-templates select="current()/ScorecardSummaryByKPI"/>
</xsl:template>

<xsl:template match="ScorecardSummaryByKPI">
<table border="1" cellspacing="0" cellpadding="5">
<tr>
<xsl:choose>
<xsl:when test="count(preceding-sibling::ScorecardSummaryByKPI) mod 6 &lt; 4">
<td>
<table border="1" cellspacing="0" cellpadding="5">
<xsl:apply-templates select="Header"/>
<xsl:apply-templates select="Data"/>
</table>
</td>
</xsl:when>
<xsl:otherwise>
<td>
<table border="1" cellspacing="0" cellpadding="5">
<xsl:apply-templates select="Header"/>
<xsl:apply-templates select="Data"/>
</table>
</td>
</xsl:otherwise>
</xsl:choose>
</tr>
</table>
</xsl:template>

XSL 像这样重复生成 6 个表:

1  
2
3
4
5
6

1
2
3
4
5
6

但我想这样排序:

1 4  
2 5
3 6

1 4
2 5
3 6

等等。我尝试使用此检查,但它不起作用。

count(preceding-sibling::ScorecardSummaryByKPI) mod 6 &lt; 4

有人能帮忙吗?

最佳答案

解释

您的表必须有两个 <td>每行(如果你想要两列)。您的 XSLT 只生成一个。

解决方案是对列表的一半进行交互并生成两个 <td>每次迭代。

所以首先我要定义表格的大小。示例:

  <xsl:param name="size" select="count(catalog/cd)"/>

然后只迭代其中的一半 ( $size div 2 )。如果输入列表可以包含非偶数个元素,则必须对数字进行舍入:ceiling($size div 2) (四舍五入以捕获最后一个元素)

      <xsl:for-each select="catalog/cd[ceiling($size div 2) &gt;= position()]">

在每次迭代中,首先渲染一个元素本身:

        <td><xsl:value-of select="title"/></td>

然后从表格的后半部分渲染一个合适的元素(offset是之前定义的数字:ceiling($size div 2)表格的一半大小)

        <td><xsl:value-of select="following::cd[ceiling($size div 2)]/title"/></td>

您可以将元素呈现包装在单独的模板中以避免代码重复。

工作示例

使用 W3C XSL TryIt ( http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog ) 检查这个转换示例:

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

<xsl:template match="/">
<xsl:param name="size" select="count(catalog/cd)"/>
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Title</th>
</tr>
<xsl:for-each select="catalog/cd[ceiling($size div 2) &gt;= position()]">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="following::cd[ceiling($size div 2)]/title"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

它将 CD 目录(在上面的示例链接中给出)分成两列。

关于xslt - 使用 XSLT 的两列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16353800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com