2011-04-14 36 views
1

我想知道是否有可能在XSLT中嵌套動態節點集,如果是這樣,如何使用xPath選擇它們。這是一個更大任務的一部分。我只是展示了我堅持的部分。是否可以在xslt中嵌套動態節點集?

這是我的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 

這是我d喜歡得到:

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 
+1

@ user708613:有兩個錯誤:您應該使用''而不是' '; '$ Columns'超出了那些最外層的'xsl:for-each'指令的範圍。你應該使用'msxsl:node-set($ Table)/ Table/Columns/Column'。 – 2011-04-14 19:27:10

+0

我只需要改變值的複製和它的作品!非常感謝! – spide 2011-04-14 19:30:38

+0

好問題,+1。看到我的答案是一個完整的,簡短而且簡單的解決方案,它不會創建任何臨時樹,並且完全不需要'xxx:node-set()'函數。 – 2011-04-15 03:10:44

回答

0

的通緝的結果可以產生IM一個更簡單的方法,也沒有必要建立任何臨時樹

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

當這種變換所提供的XML文檔應用(裹着單個頂部元件,使其充分形成的):

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

有用,正確的結果產生:

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

這是一個更大的任務的一部分,我需要其他的東西的樹。但是謝謝你 - 我通過查看你的解決方案瞭解了一點。 – spide 2011-04-15 03:48:18

+0

@ user708613:不客氣。 – 2011-04-15 04:49:30