在下面的代码中,我有显示书籍类型的xml输入。我想根据每列中的类型排列书籍类型。有些列有值,有些没有。检查预期输出。
输入
<?xml version="1.0" encoding="UTF-8"?>
<BookTypes>
<Types>
<string>T1</string>
<string>T3,M1,P1</string>
<string>T2,P2</string>
<string>M3,P3</string>
</Types>
</BookTypes>
XSLT 脚本:当前的 xslt 脚本给了我结果,但不是预期的。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="types">
<type>T</type>
<type>M</type>
<type>P</type>
</xsl:variable>
<xsl:variable name="types-set" select="exsl:node-set($types)" />
<xsl:template match="/">
<table>
<tr>
<th>T Type</th>
<th>M Type</th>
<th>P Type</th>
</tr>
<xsl:for-each select="BookTypes/Types/string">
<tr>
<xsl:variable name="splitValue">
<xsl:apply-templates/>
</xsl:variable>
<xsl:for-each select="exsl:node-set($splitValue)/*">
<xsl:variable name="mySplittedValue" select="." />
<xsl:for-each select="$types-set/type">
<xsl:variable name="my-types" select="." />
<td>
<xsl:choose>
<xsl:when test="contains($mySplittedValue, $my-types)">
<xsl:value-of select="$mySplittedValue"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>-</xsl:text>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:for-each>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="text()" name="split">
<xsl:param name="pText" select="."/>
<xsl:if test="string-length($pText) > 0">
<item>
<xsl:value-of select="substring-before(concat($pText, ','), ',')"/>
</item>
<xsl:call-template name="split">
<xsl:with-param name="pText" select="substring-after($pText, ',')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
预期产出
<table>
<tr>
<th>T Type</th>
<th>M Type</th>
<th>P Type</th>
</tr>
<tr>
<td>T1</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>T3</td>
<td>M1</td>
<td>P1</td>
</tr>
<tr>
<td>T2</td>
<td>-</td>
<td>P2</td>
</tr>
<tr>
<td>-</td>
<td>M3</td>
<td>P3</td>
</tr>
</table>
夏日:输出有三(3)种固定类型,P,M,T存在于任何一个输入中,例如P3,M3。这里 P3 包含 P(类型),因此值 P3 应位于列名 P 类型下。在输入中,有 3 或 2 或 1 个值,用逗号分隔(例如 T3,M1,P1)。每个值都应该先拆分,然后再显示在表中
我认为你正在使它变得更加复杂。尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="types">
<type>T</type>
<type>M</type>
<type>P</type>
</xsl:variable>
<xsl:variable name="types-set" select="exsl:node-set($types)" />
<xsl:template match="/">
<table>>
<tr>
<xsl:for-each select="$types-set/type">
<th><xsl:value-of select="concat(., ' Type')"/></th>
</xsl:for-each>
</tr>
<xsl:for-each select="BookTypes/Types/string">
<xsl:variable name="my-types" select="." />
<tr>
<xsl:for-each select="$types-set/type">
<td>
<xsl:choose>
<xsl:when test="contains($my-types, .)">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:text>-</xsl:text>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
结果:
<table>
<tr>
<th>T Type</th>
<th>M Type</th>
<th>P Type</th>
</tr>
<tr>
<td>T</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>T</td>
<td>M</td>
<td>P</td>
</tr>
<tr>
<td>T</td>
<td>-</td>
<td>P</td>
</tr>
<tr>
<td>-</td>
<td>M</td>
<td>P</td>
</tr>
</table>