使用xslt解析多个节点

时间:2012-09-03 02:04:44

标签: xslt

以下是我的输入xml

        <Record>
          <Header>
              <field1/>
          </Header>
          <Body>
              <firstname>x1</firstname>
              <lastname>y1</lastname>
              <company>Test1</company>
          <Body>
          <Body>
              <firstname>x2</firstname>
              <lastname>y2</lastname>
              <company></company>
          <Body>
          <Body>
              <firstname>x3</firstname>
              <lastname>y3</lastname>
              <company>Test2</company>
          <Body>
        </Record>
  1. 我试图遍历正文并检查公司值是否为空,输出相应的名字和姓氏。这整个输出,我使用xslt mapper映射到目标上的DATA。可以某人帮助我使用下面的代码无法正常工作

        <?xml version='1.0' ?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="Namespace">
            <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
                <xsl:variable name="NAME" select="/RecordSet/Body"/>
                <xsl:variable name="break">&lt;br&gt;</xsl:variable>
            <xsl:variable name="tableB">&lt;table Border="1" BorderColor="#000000"  cellpadding="4" cellspacing="0" &gt;</xsl:variable>
            <xsl:variable name="tableE">&lt;/table&gt;</xsl:variable>
            <xsl:variable name="trB">&lt;tr&gt;</xsl:variable>
            <xsl:variable name="trE">&lt;/tr&gt;</xsl:variable>
            <xsl:variable name="tdB">&lt;td&gt;</xsl:variable>
            <xsl:variable name="tdE">&lt;/td&gt;</xsl:variable>
            <xsl:variable name="nbsp">&amp;nbsp;</xsl:variable>
            <xsl:variable name="thB">&lt;tr BGCOLOR="#CCCCCC"&gt;</xsl:variable>
            <xsl:template match="/">
        <DATA>
                <xsl:value-of select="$tableB"/>
            <xsl:value-of select="$thB"/>
        <xsl:value-of select="$tdB"/>&lt;B&gt;FirstName&lt;/B&gt;
    
                        <xsl:value-of select="$nbsp"/>
                        <xsl:value-of select="$tdE"/>
                        <xsl:value-of select="$tdB"/>&lt;B&gt;LASTNAME &lt;/B&gt;
    
                        <xsl:value-of select="$nbsp"/>
                        <xsl:value-of select="$tdE"/>
        <xsl:value-of select="$trE"/>
                        <xsl:value-of select="$trB"/>
                        <xsl:for-each select="$NAME/Body[string-length(company) &gt; 0]">
        <xsl:value-of select="$tdB"/>
                            <xsl:value-of select="$MT_NAME/firstname"/>
                            <xsl:value-of select="$nbsp"/>
                            <xsl:value-of select="$tdE"/>
        <xsl:value-of select="$tdB"/>
                            <xsl:value-of select="$MT_NAME/lastname"/>
                            <xsl:value-of select="$nbsp"/>
                            <xsl:value-of select="$tdE"/>
    <xsl:if test="position() mod 2 = 0">
                <xsl:value-of select="$trE"/>
            </xsl:if>
        </xsl:for-each>
                        <xsl:value-of select="$tableE"/>
        </DATA>
    
  2. 输出应为


  3. | FIRSTNAME | LASTNAME |

    | X2 | Y2 |

2 个答案:

答案 0 :(得分:3)

提供的代码根本不会生成HTML - 它会生成 strings - 一维文本。

此外,AFAIK,DATA不是HTML元素。

此外,提供的“XML”严重格式错误。

以下是如何使用XSLT生成HTML表的示例:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <table>
   <thead>
     <tr>
       <td>First Name</td>
       <td>Last Name</td>
       <td>Company</td>
     </tr>
   </thead>
   <xsl:apply-templates/>
  </table>
 </xsl:template>

 <xsl:template match="Body">
  <tr>
   <xsl:apply-templates select="*"/>
  </tr>
 </xsl:template>

 <xsl:template match="Body/*">
  <td>&#xA0;</td>
 </xsl:template>

 <xsl:template match="Body/*[normalize-space()]">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档(提供严重格式错误的文本时已更正):

<Record>
    <Header>
        <field1/>
        <Body>
            <firstname>x1</firstname>
            <lastname>y1</lastname>
            <company>Test1</company>
        </Body>
        <Body>
            <firstname>x2</firstname>
            <lastname>y2</lastname>
            <company></company>
        </Body>
        <Body>
            <firstname>x3</firstname>
            <lastname>y3</lastname>
            <company>Test2</company>
        </Body>
    </Header>
</Record>

制作了一个有意义且合理的HTML表格:

<table>
   <thead>
      <tr>
         <td>First Name</td>
         <td>Last Name</td>
         <td>Company</td>
      </tr>
   </thead>
   <tr>
      <td>x1</td>
      <td>y1</td>
      <td>Test1</td>
   </tr>
   <tr>
      <td>x2</td>
      <td>y2</td>
      <td>&nbsp;</td>
   </tr>
   <tr>
      <td>x3</td>
      <td>y3</td>
      <td>Test2</td>
   </tr>
</table>

答案 1 :(得分:2)

我必须猜测你的要求,因为它们没有得到很好的解释。

这个XSLT 1.0样式表...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*" />  

<xsl:template match="/">
  <DATA>
    <table Border="1" BorderColor="#000000"  cellpadding="4" cellspacing="0">
      <tr BGCOLOR="#CCCCCC">
        <th>First name</th>
        <th>Last name</th>
        <th>Company</th>
      </tr>
      <xsl:apply-templates select="*/Body" /> 
    </table>
  </DATA>
</xsl:template>

<xsl:template match="Body">
  <tr>
    <td><xsl:value-of select="firstname" /></td>
    <td><xsl:value-of select="lastname" /></td>
    <td>
      <xsl:choose>
        <xsl:when test="company!=''" >
          <xsl:value-of select="company" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat(firstname,' ',lastname)" />
        </xsl:otherwise>
      </xsl:choose>
    </td>
  </tr>  
</xsl:template>

</xsl:stylesheet>

...当应用于此文档时......

<Record>
    <Header>
        <field1/>
    </Header>
    <Body>
        <firstname>x1</firstname>
        <lastname>y1</lastname>
        <company>Test1</company>
    </Body>
    <Body>
        <firstname>x2</firstname>
        <lastname>y2</lastname>
        <company/>
    </Body>
    <Body>
        <firstname>x3</firstname>
        <lastname>y3</lastname>
        <company>Test2</company>
    </Body>
</Record>

......会产生......

<DATA>
  <table Border="1" BorderColor="#000000" cellpadding="4" cellspacing="0">
    <tr BGCOLOR="#CCCCCC">
      <th>First name</th>
      <th>Last name</th>
      <th>Company</th>
    </tr>
    <tr>
      <td>x1</td>
      <td>y1</td>
      <td>Test1</td>
    </tr>
    <tr>
      <td>x2</td>
      <td>y2</td>
      <td>x2 y2</td>
    </tr>
    <tr>
      <td>x3</td>
      <td>y3</td>
      <td>Test2</td>
    </tr>
  </table>
</DATA>

注意

请注意,当输入公司为空或缺失时,根据规定的要求,公司的中间记录的单元格值为“x2 y2”。


更新

输入文档仍然严重错误。考虑到OP的更新要求,这个XSLT 1.0样式表......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*" />  

<xsl:template match="/">
  <DATA>
    <table Border="1" BorderColor="#000000"  cellpadding="4" cellspacing="0">
      <tr BGCOLOR="#CCCCCC">
        <th>First name</th>
        <th>Last name</th>
      </tr>
      <xsl:apply-templates select="*/Body[company='']" /> 
    </table>
  </DATA>
</xsl:template>

<xsl:template match="Body">
  <tr>
    <td><xsl:value-of select="firstname" /></td>
    <td><xsl:value-of select="lastname" /></td>
  </tr>  
</xsl:template>

</xsl:stylesheet>

...当应用于与之前相同的输入文档时,产生...

<DATA>
  <table Border="1" BorderColor="#000000" cellpadding="4" cellspacing="0">
    <tr BGCOLOR="#CCCCCC">
      <th>First name</th>
      <th>Last name</th>
    </tr>
    <tr>
      <td>x2</td>
      <td>y2</td>
    </tr>
  </table>
</DATA>