2014-02-16 75 views
1

玩弄xml和xslt,並試圖獲得它的竅門。XML到XSLT轉換 - 第一次

我的XML代碼如下所示:

<hello-world> 
    <header eng="Welcome!" dk="Velkommen"></header> 
    <greeting> 
     <eng>Hello, World!</eng> 
     <dk>Hej verden</dk> 
    </greeting> 
    <greeting> 
     <eng>Hello space</eng> 
     <dk>Hej Rummet!</dk> 
    </greeting> 
    <greeting> 
     <eng>Hey Mom! Im coding XSLT</eng> 
     <dk>Hej Mor! Jeg koder XSLT</dk> 
    </greeting> 
</hello-world> 

到目前爲止,我翻譯我的XML到這個網站:

<html> 
    <body> 
     <div> 
     <ul> 
      <li>Hello, World!</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hello space</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hey Mom! Im coding XSLT</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hej verden</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hej Rummet!</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hej Mor! Jeg koder XSLT</li> 
     </ul> 
     </div> 
    </body> 
</html> 

通過使用該XSLT的:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
     <xsl:for-each select="/hello-world/greeting"> 
<div> 
     <ul> 
     <li><xsl:value-of select="eng" /></li> 
     </ul> 
    </div> 
     </xsl:for-each> 
<xsl:for-each select="/hello-world/greeting"> 
<div> 
     <ul> 
     <li><xsl:value-of select="dk" /></li> 
     </ul> 
    </div> 
     </xsl:for-each> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

我想知道的是,如果有更好的方法來做到這一點,以及我如何能夠實現並選擇正確的屬性e標題並在foreach中應用。

謝謝!

+0

在XSLT您可以使用[應用模板函數(http://msdn.microsoft.com/en-us/library/ms256045%定義自己的模板* * 28v = vs.110%29.aspx),這與過程式編程語言中的函數有些相同。 – pasty

+0

您可以重新編輯您的問題,以便Google仍然可以找到問題嗎?目前這個問題毫無用處。 –

回答

-1

在XSLT你也可以定義使用apply-template function自己的模板,這與程序編程語言中的函數有些相同。該模板應用於選擇值。模板是一個強大的概念。他們也可以接受參數,以便您可以將多個值傳遞給模板並控制流程。

您需要定義兩種語言的模板(主模板後):

<xsl:template match="dk"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

    <xsl:template match="eng"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

,然後主模板調用它們爲需要的值:

<xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="eng"></xsl:apply-templates> 
     </xsl:for-each> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="dk"></xsl:apply-templates> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 

輸出將與您的原始輸出相同。你基本上是說formatOutputFor(currentStringValue)。完整的轉型看起來是這樣的:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="eng"></xsl:apply-templates> 
     </xsl:for-each> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="dk"></xsl:apply-templates> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="dk"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

    <xsl:template match="eng"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 
+0

由於這兩個模板都在做同樣的工作,我認爲這個代碼體積小且冗餘。 –

+0

這只是您的解決方案的變體。是的,它包含冗餘代碼,但我認爲對於一個對XSLT概念較爲缺乏經驗和熟悉的人來說更容易理解。 – pasty

+0

downvoter會謹慎解釋答案的錯誤嗎? – pasty

2

您可以使用一個模板,做了兩個「工程」和「DK」的元素,並按順序應用它的「工程」和「DK」:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <xsl:apply-templates select="hello-world/greeting/eng"/> 
      <xsl:apply-templates select="hello-world/greeting/dk"/> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="dk | eng"> 
    <div> 
    <ul> 
     <li><xsl:value-of select="."/></li> 
    </ul> 
    </div> 
</xsl:template> 
</xsl:stylesheet> 
+0

真棒,這是一個偉大的方式!但仍然有挑戰在序列中應用

? – user3315960

+0

我很抱歉,但沒有理解這個挑戰。你能解釋一下嗎? –

+0

沒關係,我找到了解決方案:)感謝您的幫助! – user3315960