Xml 生成所有值的组合
我经常需要生成测试数据文件,其中包含3或4个字段的所有可能值。下面是一个包含3个值的示例XML(但通常还有更多…)Xml 生成所有值的组合,xml,xslt,Xml,Xslt,我经常需要生成测试数据文件,其中包含3或4个字段的所有可能值。下面是一个包含3个值的示例XML(但通常还有更多…) 我希望创建以下输出 <xml> <row service='T' terminal='JFK' lodgement='MEL'/> <row service='T' terminal='JFK' lodgement='PER'/> <row service='T' terminal='JFK' lodgement
我希望创建以下输出
<xml>
<row service='T' terminal='JFK' lodgement='MEL'/>
<row service='T' terminal='JFK' lodgement='PER'/>
<row service='T' terminal='JFK' lodgement='SYD'/>
<row service='T' terminal='EWR' lodgement='MEL'/>
<row service='T' terminal='EWR' lodgement='PER'/>
<row service='T' terminal='EWR' lodgement='SYD'/>
<row service='T' terminal='ORD' lodgement='MEL'/>
<row service='T' terminal='ORD' lodgement='PER'/>
<row service='T' terminal='ORD' lodgement='SYD'/>
<row service='U' terminal='JFK' lodgement='MEL'/>
<row service='U' terminal='JFK' lodgement='PER'/>
<row service='U' terminal='JFK' lodgement='SYD'/>
<row service='U' terminal='EWR' lodgement='MEL'/>
<row service='U' terminal='EWR' lodgement='PER'/>
<row service='U' terminal='EWR' lodgement='SYD'/>
<row service='U' terminal='ORD' lodgement='MEL'/>
<row service='U' terminal='ORD' lodgement='PER'/>
<row service='U' terminal='ORD' lodgement='SYD'/>
</xml>
我有这个XSL工作,但它完全是硬编码的,我正在寻找一个通用的解决方案,可以用于任何数量的数据集
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name='servicerow' select='//dataset[@name="service"]/row'/>
<xsl:variable name='terminalrow' select='//dataset[@name="terminal"]/row'/>
<xsl:variable name='lodgementrow' select='//dataset[@name="lodgement"]/row'/>
<xsl:template match='/'>
<xml>
<xsl:for-each select='$servicerow'>
<xsl:variable name='service' select='@code'/>
<xsl:for-each select='$terminalrow'>
<xsl:variable name='terminal' select='@code'/>
<xsl:for-each select='$lodgementrow'>
<xsl:variable name='lodgement' select='@code'/>
<xsl:element name='row'>
<xsl:attribute name='service'><xsl:value-of select='$service'/></xsl:attribute>
<xsl:attribute name='terminal'><xsl:value-of select='$terminal'/></xsl:attribute>
<xsl:attribute name='lodgement'><xsl:value-of select='$lodgement'/></xsl:attribute>
</xsl:element>
</xsl:for-each> <!-- lodgement -->
</xsl:for-each> <!-- terminal -->
</xsl:for-each> <!-- service -->
</xml>
</xsl:template>
</xsl:stylesheet>
这能帮你吗
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match='/xml'>
<xml>
<xsl:apply-templates select="dataset[1]/row" />
</xml>
</xsl:template>
<xsl:template match="row">
<xsl:param name="prev" />
<xsl:choose>
<xsl:when test="../following-sibling::dataset">
<xsl:choose>
<xsl:when test="$prev">
<xsl:apply-templates select="../following-sibling::dataset[1]/row">
<xsl:with-param name="prev" select=". | $prev" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="../following-sibling::dataset[1]/row">
<xsl:with-param name="prev" select="." />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<row>
<xsl:for-each select="$prev|.">
<xsl:attribute name="{../@name}">
<xsl:value-of select="@code" />
</xsl:attribute>
</xsl:for-each>
</row>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这能帮你吗
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match='/xml'>
<xml>
<xsl:apply-templates select="dataset[1]/row" />
</xml>
</xsl:template>
<xsl:template match="row">
<xsl:param name="prev" />
<xsl:choose>
<xsl:when test="../following-sibling::dataset">
<xsl:choose>
<xsl:when test="$prev">
<xsl:apply-templates select="../following-sibling::dataset[1]/row">
<xsl:with-param name="prev" select=". | $prev" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="../following-sibling::dataset[1]/row">
<xsl:with-param name="prev" select="." />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<row>
<xsl:for-each select="$prev|.">
<xsl:attribute name="{../@name}">
<xsl:value-of select="@code" />
</xsl:attribute>
</xsl:for-each>
</row>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Minor thing,如果只有一个数据集,$prev是空的,它会弄乱.NET解析器。我添加了一个检查,以查看xsl:otherwisesminor中是否存在$prev,如果只有1个数据集,$prev是空的,它会使.NET解析器出错。我添加了一个检查,以查看xsl中是否存在$prev:否则