在xslt中循环xml节点

时间:2016-10-21 12:08:07

标签: xslt

我认为自己仍然是xslt的新手,因为我到目前为止所做的只是使用templateobject和变量的基本操作并得到一个html输出。我正在进行复杂计算的学习步骤。我需要论坛专家帮助解决我的一个问题。

我正在构建电子邮件模板。下面是我要转换的xslt。 除此之外,我想将另一个xml传递给它,让xslt循环并获取要在html中各自位置分配的属性值。

下面的代码不起作用,只是举例说明我打算做什么。

XSLT

<Root>
  <item ProductName="abc" Amount="$20" />
  <item ProductName="xyz" Amount="$50" />
</Root>

XML

{{1}}

我尝试将xml作为字符串分配给xslt变量,并尝试使用document()函数在XSLT中创建文档,但仍然无法遍历元素和属性。

感谢您对此的任何帮助

其他几个问题: - 我可以通过在标题上声明命名空间,通过c#为xslt分配多个xml来嵌套xsl:template吗? - 可以在xslt中从字符串转换为xml吗?

1 个答案:

答案 0 :(得分:1)

以下是完整的工作示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" omit-xml-declaration="yes" indent="yes" />
 <xsl:strip-space elements="*"/>
 <xsl:param name="pPath" select="'file:///c:/temp/delete/products.xml'"/>

 <xsl:variable name="vdocProducts" select="document($pPath)"/>

  <xsl:template match="/body">
        <html>
          <body bgcolor="#E5E5E5" leftmargin="0" marginwidth="0" topmargin="0" 
                    marginheight="0" offset="0">
          <table style="width:100%;" class="orderItems">
            <xsl:apply-templates select="$vdocProducts/*/item"/>
          </table>
         </body>
        </html>
  </xsl:template>

  <xsl:template match="item">
      <tbody>
        <tr>
          <td class="itemThumbnail" style="width:80px; height:70px; padding-top:20px;">
           <img src="ref" alt="" />
          </td>
          <td style="padding-top:20px; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">
            <xsl:value-of select="@ProductName" /><br />
             Quantity: 1
          </td>
          <td style="text-align:right; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">
            Price: <strong style="font-size:20px; color:#b9277e;">
                            <xsl:value-of select="@Amount" />
                    </strong>
          </td>
    </tr>
  </tbody>
  </xsl:template>
</xsl:stylesheet>

这里有一个(未指定的)源XML文档

<body/>

并且提供的XML文档驻留在文件系统中,其文件URI是全局参数$pPath的值。

在这种情况下,XML文档位于c:\temp\delete\products.xml

<Root>
  <item ProductName="abc" Amount="$20" />
  <item ProductName="xyz" Amount="$50" />
</Root>

对(未指定的单元素)源XML文档应用转换时,生成所需结果

<html>
   <body bgcolor="#E5E5E5" leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
      <table style="width:100%;" class="orderItems">
         <tbody>
            <tr>
               <td class="itemThumbnail" style="width:80px; height:70px; padding-top:20px;"><img src="ref" alt=""></td>
               <td style="padding-top:20px; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">abc<br>
                  Quantity: 1

               </td>
               <td style="text-align:right; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">
                  Price: <strong style="font-size:20px; color:#b9277e;">$20</strong></td>
            </tr>
         </tbody>
         <tbody>
            <tr>
               <td class="itemThumbnail" style="width:80px; height:70px; padding-top:20px;"><img src="ref" alt=""></td>
               <td style="padding-top:20px; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">xyz<br>
                  Quantity: 1

               </td>
               <td style="text-align:right; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">
                  Price: <strong style="font-size:20px; color:#b9277e;">$50</strong></td>
            </tr>
         </tbody>
      </table>
   </body>
</html>

<强>更新

在样式表XML树中使用embedded:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" xmlns:my="my:my" exclude-result-prefixes="my ext">
 <xsl:output method="html" omit-xml-declaration="yes" indent="yes" />
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vrtfdocProducts">
    <Root>
      <item ProductName="abc" Amount="$20" />
      <item ProductName="xyz" Amount="$50" />
    </Root>
 </xsl:variable>
 <xsl:variable name="vdocProducts" select="ext:node-set($vrtfdocProducts)"/>

  <xsl:template match="/body">
        <html>
          <body bgcolor="#E5E5E5" leftmargin="0" marginwidth="0" topmargin="0" 
                    marginheight="0" offset="0">
          <table style="width:100%;" class="orderItems">
            <xsl:apply-templates select="$vdocProducts/*/item"/>
          </table>
         </body>
        </html>
  </xsl:template>

  <xsl:template match="item">
      <tbody>
        <tr>
          <td class="itemThumbnail" style="width:80px; height:70px; padding-top:20px;">
           <img src="ref" alt="" />
          </td>
          <td style="padding-top:20px; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">
            <xsl:value-of select="@ProductName" /><br />
             Quantity: 1
          </td>
          <td style="text-align:right; font-family:Arial, Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 20px; color:#4c4c4c;">
            Price: <strong style="font-size:20px; color:#b9277e;">
                            <xsl:value-of select="@Amount" />
                    </strong>
          </td>
    </tr>
  </tbody>
  </xsl:template>
</xsl:stylesheet>