-3

下面是我的输入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 映射器映射到目标上的 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. 输出应该是


|名字|姓氏|

| X2 | Y2 |

4

2 回答 2

3

提供的代码根本不生成 HTML——它生成字符串——一维文本。

此外,AFAIKDATA不是 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>
于 2012-09-03T03:29:01.247 回答
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>
于 2012-09-03T03:48:49.127 回答