对于第一行XSLT特殊条件(XSLT special condition for first row

2019-10-17 07:21发布

我试图解析用XSLT的XML文件。

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

我如何分配类=“FIRSTROW”的第一行和带class =“一个tabpanel”所有其他行?

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

谢谢

Answer 1:

像这样简单

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


Answer 2:

所有的Firt,应该有你的源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应包含完整的文件路径。

您可以通过调用此方法得到变换后的输出。



文章来源: XSLT special condition for first row