XSLT第一行的特殊条件

时间:2012-10-11 13:24:09

标签: xml xslt xml-parsing

我正在尝试使用xslt解析xml文件。

我需要将值组合在div标签中。 div标记的第一行应该有一个特殊的类<div class="firstrow"> 所有其他行应该有<div class="tabpanel">

如何为第一行和所有其他行分配class =“firstrow”class =“tabpanel”?

source xml

<row>
   <column1>ABC</<column1>
   <column2>ABC</<column2>
</row>
<row>
   <column1>123</<column1>
   <column2>123</<column2>
</row>
<row>
   <column1>234</<column1>
   <column2>234</<column2>
</row>

我想要的输出

<div class="firstrow">
   ABC
   ABC
</div>
<div class="tabpanel">
   123
   123
</div>
<div class="tabpanel">
   234
   234
</div>

由于

2 个答案:

答案 0 :(得分:4)

首先,源xml中应该有一个根元素,所以我按如下方式更改了它:

来源Xml

<rows>
  <row>
    <column1>
      ABC
    </column1>
    <column2>
      ABC
    </column2>
  </row>
  <row>
    <column1>
      123
    </column1>
    <column2>
      123
    </column2>
  </row>
  <row>
    <column1>
      234
    </column1>
    <column2>
      234
    </column2>
  </row>
</rows>

必需的Xslt

<?xml version="1.0" encoding="utf-8"?>
<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:output method="html" indent="yes"/>

    <xsl:template match="rows">
      <xsl:for-each select="row">
        <xsl:if test="position() = 1">
          <div class="firstrow">
            <xsl:call-template name="PrintColumnValues"></xsl:call-template>
          </div>
        </xsl:if>
        <div class="tabpanel">
          <xsl:call-template name="PrintColumnValues"></xsl:call-template>
        </div>
      </xsl:for-each>
    </xsl:template>

  <xsl:template name="PrintColumnValues">
    <xsl:value-of select="column1"/>
    <xsl:value-of select="column2"/>
  </xsl:template>
</xsl:stylesheet>

使用此xslt转换源xml后,您将获得所需的html输出。

注意:作为帮助,我在这里添加了一些可用于xslt转换的代码。

public static string TransformContentXmlwithXslt(XmlDocument xmlDocument, string xsltFileName)
    {
        //Load the XML data document
        MemoryStream contentStream = new MemoryStream();
        xmlDocument.Save(contentStream);
        contentStream.Position = 0;
        XPathDocument mergedXPathDocument = new XPathDocument(contentStream);
        XsltSettings xsltJsSetting = new XsltSettings();
        xsltJsSetting.EnableScript = true;

        //Load the XSLT file
        string xsltFilePath = xsltFileName;
        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(xsltFilePath, xsltJsSetting, new XmlUrlResolver());

        //Do the transformation
        MemoryStream transformedContentMemoryStream = new MemoryStream();
        XmlTextWriter writer = new XmlTextWriter(transformedContentMemoryStream, Encoding.UTF8);
        StreamReader streamReader = new StreamReader(transformedContentMemoryStream);
        xslt.Transform(mergedXPathDocument, writer);
        transformedContentMemoryStream.Position = 0;
        string transformedHtml = streamReader.ReadToEnd();

        //// Close the connections
        streamReader.Close();
        transformedContentMemoryStream.Close();

        return transformedHtml;
    }

此处,xsltFileName应包含完整的文件路径。

您可以通过调用此方法来获取转换后的输出。

答案 1 :(得分:3)

就这么简单

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="row[1]">
     <div class="firstrow"><xsl:value-of select="."/></div>
 </xsl:template>
 <xsl:template match="row">
     <div class="tabpanel"><xsl:value-of select="."/></div>
 </xsl:template>
</xsl:stylesheet>

对此XML文档应用此转换(提供的转换,格式正确!):

<t>
    <row>
        <column1>ABC</column1>
        <column2>ABC</column2>
    </row>
    <row>
        <column1>123</column1>
        <column2>123</column2>
    </row>
    <row>
        <column1>234</column1>
        <column2>234</column2>
    </row>
</t>

产生了想要的正确结果:

<div class="firstrow">
        ABC
        ABC
    </div>

<div class="tabpanel">
        123
        123
    </div>

<div class="tabpanel">
        234
        234
    </div>