【发布时间】:2011-04-14 19:17:51
【问题描述】:
我想知道是否可以在 XSLT 中嵌套动态节点集,如果可以,如何使用 xPath 选择它们。这是一项更大任务的一部分。我只展示了我卡住的部分。
这是我的 XSLT:
<xsl:variable name="Tables">
<xsl:for-each select="Table">
<xsl:variable name="TableName" select="Name | @Name"/>
<xsl:variable name="Columns">
<xsl:for-each select="Column">
<xsl:variable name="ColumnName" select="Name | @Name"/>
<xsl:variable name="Type" select="Type | @Type"/>
<Column>
<Name>
<xsl:value-of select="$ColumnName"/>
</Name>
<Type>
<xsl:value-of select="$Type"/>
</Type>
</Column>
</xsl:for-each>
</xsl:variable>
<Table>
<Name>
<xsl:value-of select="$TableName"/>
</Name>
<Columns>
<xsl:value-of select="$Columns"/>
</Columns>
</Table>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="msxsl:node-set($Tables)/Table">
Table Name: <xsl:value-of select="Name"/>
<xsl:for-each select="msxsl:node-set(Columns)/Column" xml:space="preserve">
Column Name: <xsl:value-of select="Name"/>
Column Type: <xsl:value-of select="Type"/>
</xsl:for-each>
</xsl:for-each>
这是我的 XML:
<Table Name="Product">
<Column Name="ProductID" Type="int"/>
<Column Name="Name" Type="string"/>
<Column Name="Cost" Type="decimal"/>
<Column Name="Area" Type="decimal?"/>
</Table>
<Table Name="Market">
<Column Name="MarketID" Type="int"/>
<Column Name="Name" Type="string"/>
<Column Name="MinimumASP" Type="double"/>
<Column Name="MaximumASP" Type="double"/>
</Table>
这是我目前得到的输出:
Table Name: Product
Table Name: Market
这是我想要的:
Table Name: Product
Column Name: ProductID
Column Type: int
Column Name: Name
Column Type: string
Column Name: Cost
Column Type: decimal
Column Name: Area
Column Type: decimal?
Table Name: Market
Column Name: MarketID
Column Type: int
Column Name: Name
Column Type: string
Column Name: MinimumASP
Column Type: double
Column Name: MaximumASP
Column Type: double
【问题讨论】:
-
@user708613:有两个错误:你应该使用
<xsl:copy-of select="$Columns"/>而不是<xsl:value-of select="$Columns"/>;$Columns超出了那些最外面的xsl:for-each指令的范围。你应该使用msxsl:node-set($Table)/Table/Columns/Column。 -
我只需要将 value-of 更改为 copy-of 就可以了!非常感谢!
-
好问题,+1。请参阅我的答案以获得完整、简短且简单的解决方案,该解决方案不会创建任何临时树并且根本不需要
xxx:node-set()函数。
标签: xslt dynamic msxsl node-set