XML到XSLT转换 - 第一次

时间:2014-02-16 13:02:04

标签: xml xslt xpath

使用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:

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

我想知道的是,如果有更好的方法,以及如何在标题上实现和选择正确的属性并应用于foreach。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用为“eng”和“dk”元素执行某些操作的模板,并按顺序将其应用于“eng”和“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>

答案 1 :(得分:-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>