开发者

is it possible to nest dynamic node-sets in xslt?

开发者 https://www.devze.com 2023-02-25 09:36 出处:网络
I\'d like to know if it is possible to nest dynamic node sets in XSLT and if so, how to select them using xPath.This is part of a bigger task.I\'m only showing the part that I\'m stuck on.

I'd like to know if it is possible to nest dynamic node sets in XSLT and if so, how to select them using xPath. This is part of a bigger task. I'm only showing the part that I'm stuck on.

开发者_如何学CThis is my 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>

This is my 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>

This is the output I'm currently getting:

  Table Name: Product
  Table Name: Market

This is what I'd like to get:

  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


The wanted result can be produced im a much simpler way and there is no need to create any temporary trees:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="*/*">
  <xsl:apply-templates select="@*|*"/>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:value-of select=
   "concat(name(..), ' ', name(), ': ', .)"/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the provided XML document (wrapped in a single top element to make it well-formed):

<t>
    <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>
</t>

the wanted, correct result is produced:

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
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号