2012-12-12 47 views
0

如何在不知道節點名稱的情況下使用XSTL轉換XML文檔。所以基本上它應該與任何XML文檔通用。使用XSLT匹配XML文檔中的任何節點(即使我不知道節點的名稱)

比方說,我得到了這個XML文檔:

<?xml version="1.0"?> 
<?xml-stylesheet href="transform.xsl" type="text/xsl" ?> 
<!DOCTYPE cinema [ 
<!ELEMENT a (b*)> 
<!ELEMENT b (c,d,e)> 
<!ELEMENT c (#PCDATA)> 
<!ELEMENT d (#PCDATA)> 
<!ELEMENT e (#PCDATA)> 
]> 

<cinema> 
<movie> 
    <actor>Some actor</actor> 
    <title>Some title</title> 
    <year>Some year</year> 
</movie> 
</cinema> 

我將如何創建一個HTML表出來呢?我知道我可以匹配根元素是這樣的:

<xsl:template match="/"> 

然後我選擇這樣所有的電影:

<xsl:for-each select="/*/*"> 

但如何我知道得到一個行每部電影有三列的演員,標題&年?特別是由於XML文件(電影)應該能夠只可能有2個孩子或5

+++編輯+++

如果我這樣做:在

<tr> 
    <td><xsl:value-of select="."/></td> 
</tr> 

我得到的每部電影的詳細信息一排。這幾乎接近我想要實現的目標。但是,如何將電影細節分散在該行的三列中?

+0

你需要的細節排隊?例如。演員,如果存在,是否總是需要在同一列? – LarsH

回答

2

如果你知道你將永遠有三個層次的要素(根,子子孫孫)的則是這樣應該這樣做:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" /> 

    <xsl:template match="/"> 
    <html><body><xsl:apply-templates /></body></html> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <table><xsl:apply-templates /></table> 
    </xsl:template> 

    <xsl:template match="/*/*"> 
    <tr><xsl:apply-templates /></tr> 
    </xsl:template> 

    <xsl:template match="/*/*/*"> 
    <td><xsl:apply-templates /></td> 
    </xsl:template> 
</xsl:stylesheet> 

/模板匹配文檔節點,/*匹配文檔節點的第一級子元素(即根元素文檔),/*/*比賽二級子等

<xsl:apply-templates/>(無select)將適用匹配模板當前節點,其中包括子元素,文本節點,註釋和處理指令的所有子節點。其結果是,你可能需要在根模板是

<xsl:template match="/"> 
    <html><body><xsl:apply-templates select="*" /></body></html> 
    </xsl:template> 

選擇獨生子女元素

+0

這很完美!非常感謝!!是的,我確實想要爲具有三個元素級別的XML文檔執行操作。 –

0

使用

<xsl:template match="movie"> 
<!-- Specify your tr-producing code here --> 
</xsl:template> 
+0

但是,如果我有一個XML文件,其中不叫電影,但電影。我基本上嘗試創建可以與_any_ xml文檔一起工作的東西。 –

+0

@domdev,如果你對這個文件一無所知,那麼它是沒用的...... –

1

示例XML:

<?xml version="1.0" encoding="utf-8"?> 
<cinema> 
    <movie> 
    <actor>Some actor</actor> 
    <title>Some title</title> 
    <year>Some year</year> 
    </movie> 
    <movie> 
    <actor>Someother actor</actor> 
    <title>Someother title</title> 
    <year>Someother year</year> 
    </movie> 
</cinema> 

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <table> 
     <xsl:for-each select="*/*"> 
      <xsl:if test="position()=1"> 
      <tr> 
       <th>actor</th> 
       <th>title</th> 
       <th>year</th> 
      </tr> 
      </xsl:if> 
      <tr> 
      <xsl:for-each select="actor|title|year"> 
       <td> 
       <xsl:value-of select="."/> 
       </td> 
      </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<?xml version="1.0" encoding="utf-8"?> 
<table> 
    <tr> 
    <th>actor</th> 
    <th>title</th> 
    <th>year</th> 
    </tr> 
    <tr> 
    <td>Some actor</td> 
    <td>Some title</td> 
    <td>Some year</td> 
    </tr> 
    <tr> 
    <td>Someother actor</td> 
    <td>Someother title</td> 
    <td>Someother year</td> 
    </tr> 
</table> 
相關問題