1

xslt で xml ファイルを解析しようとしています。

値を div タグでグループ化する必要があります。最初の行の div タグには特別なクラスが必要です。<div class="firstrow"> 他のすべての行には<div class="tabpanel">.

class="tabpanel" を使用して最初の行と他のすべての行に class="firstrow" を割り当てるにはどうすればよいですか?

ソース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>

ありがとう

4

2 に答える 2

3

何よりもまず、ソース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は、完全なファイルパスが含まれている必要があります。

このメソッドを呼び出すことにより、変換された出力を取得できます。

于 2012-10-11T14:52:51.153 に答える
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>
于 2012-10-11T13:35:35.523 に答える