2

我有一个 XML 工作流,我们正在从 XML 源构建输出文档,但一些数据元素是空的,但仍出现在输出中。问题是我们正在根据最终输出生成段落返回和间距。

在某些情况下,数据包含<address1><address2>元素。当它出现时,我们希望它看起来像这样(A):

<address1>123 Main Str</address1><xsl:text> </xsl:text><zip>60060</zip>

当元素中没有数据时<address2>,我们希望它以这种方式出现(B):

<address1>123 Main Str</address1> <hours>M-F 9:00am - 5:00pm</hours><xsl:text> 
</xsl:text><address2>PO Box 123</address2> <zip>60060</zip>

但是,XML 包含 EMPTY 数据元素,<address2></address2>因此我们最终会遇到以下情况(C):

<address1>123 Main Str</address1> <hours>M-F 9:00am - 5:00pm</hours><xsl:text> 
</xsl:text><address2/><xsl:text> </xsl:text><zip>60060</zip>

我们的 XSL 工作正常,直到它碰到一个空元素。我敢肯定,即使有一个空元素,也有办法创建选项 A。我尝试使用<xsl:if test="string-length(node) != 0">,但我无法让它工作。我想摆脱空<address2/>元素并将元素移动<zip>到上一行。

这是我当前的 XSL:

<?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="IndividualBanks_2011 final.xml" -->
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>

<xsl:output method="xml"/>
<xsl:template match="/">

<Root>
<Story><xsl:apply-templates select="Root"/></Story>
</Root>
</xsl:template>

<xsl:template match="BankName | Address1 | Hours | Established | RoutingNbr | CO/CityOfficePhone | CO/CityOfficeAddress2 "><xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element></xsl:template>
<xsl:template match="BK">
<xsl:apply-templates select="BankName"/><xsl:text>  </xsl:text><xsl:apply-templates select="Established"/>    <xsl:text>    </xsl:text><xsl:apply-templates select="RoutingNbr"/><xsl:text>
</xsl:text>
<xsl:apply-templates select="OfficeOfLabel"/>
<xsl:apply-templates select="Address1"/><xsl:text>  </xsl:text><xsl:apply-templates select="Hours"/>
<xsl:apply-templates select="Address2"/><xsl:apply-templates select="Zip"/>
</xsl:template>
<xsl:template match="Address2"><xsl:text>
</xsl:text><Address2><xsl:value-of select="."/></Address2><xsl:text>    </xsl:text>
</xsl:template>

<xsl:template match="Zip">
<Zip><xsl:value-of select="."/></Zip><xsl:text>
</xsl:text></xsl:template>
</xsl:stylesheet>

这是 XML 数据源:

<Root><BK><BankName>Ames National Corporation</BankName><Established>Est. 1975</Established><RoutingNbr>8020-0135-0</RoutingNbr><Address1>405 5th Street</Address1><Hours>Hrs: M-F 8-5</Hours><Address2></Address2>  <Zip>50010</Zip><Fax>FAX: (515) 663-3033</Fax><Phone>(515) 232-6251</Phone><WebURL>Web: www.amesnational.com</WebURL><MultiBankLabel>Please see Multi-Bank Holding Companies section</MultiBankLabel>
</BK>
<BK><BankName>Bank of the West</BankName><Address1>525 Main</Address1><Zip>50010-6008</Zip><Fax>FAX: (515) 232-3791</Fax><Phone>(515) 232-8664</Phone><OfficeOfLabel>Office of Bank of the West, West Des Moines</OfficeOfLabel>
<EH><Employee>Michael Sondall, BM</Employee></EH>
</BK>
<BK><BankName>Bankers Trust Company</BankName><Address1>1510 Buckeye </Address1><Zip>50010</Zip><Phone>(515) 233-4424</Phone><WebURL>Web: www.bankerstrust.com</WebURL><OfficeOfLabel>Office of Bankers Trust Company, Des Moines</OfficeOfLabel>
<EH><Employee>John Russell, VP</Employee></EH>
</BK>
<BK><BankName>Exchange State Bank</BankName><RoutingNbr>0739-0950-7</RoutingNbr><Address1>823 Wheeler, Ste 32</Address1><Zip>50010</Zip><Fax>FAX: (515) 232-5068</Fax><Phone>(515) 232-5060</Phone><Email>e-Mail: ames@esb1.com</Email><OfficeOfLabel>Office of Exchange State Bank, Collins</OfficeOfLabel>
<EH><Employee>Allison Appel, VP, CPA</Employee></EH><EH><Employee>Christine Heintz, AVP</Employee></EH>
</BK>
<BK><BankName>First American Bank</BankName><Established>Est. 1956</Established><RoutingNbr>0739-0080-7</RoutingNbr><Address1>1530 S Duff Avenue, Ste 1</Address1><Hours>Hrs: M-TH 9-5 SAT 8-12</Hours><Address2>    </Address2><Zip>50010</Zip><Fax>FAX: (515) 956-3160</Fax><Phone>(515) 233-2033</Phone><WebURL>Web: </WebURL>    <OfficeOfLabel>Office of First American Bank, Fort Dodge</OfficeOfLabel>
<EH><Employee>Steve Goodhue, Reg Pres</Employee></EH>
</BK></Root>
4

2 回答 2

1

您给我们的信息似乎有很多不一致的地方,但简单的解决方法是添加一个模板规则:

<xsl:template match="address2[not(child::node())]"/>
于 2012-07-03T15:01:38.660 回答
0

您使用该string-length功能的方法还不错,但也许您将其插入了错误的位置?

当我替换您的 XSLT 行时,该<Zip>元素位于我的前一行

<xsl:template match="Address2"><xsl:text>

<xsl:template match="Address2[string-length() != 0]"><xsl:text>

这样做是你想要的吗?<Hours>如果没有<Address2>指定,我不太确定您是否也想跳过。

更新:<Address2>如果为空,为了对元素应用不同的排序,请使用具有<xsl:choose>与上述类似条件的结构:

<xsl:template match="BK">
<xsl:apply-templates select="BankName"/><xsl:text>  </xsl:text><xsl:apply-templates select="Established"/>    <xsl:text>    </xsl:text><xsl:apply-templates select="RoutingNbr"/><xsl:text>
</xsl:text>
<xsl:apply-templates select="OfficeOfLabel"/>
<xsl:choose>
<xsl:when test="string-length(Address2) != 0">
<xsl:apply-templates select="Address1"/><xsl:text>  </xsl:text><xsl:apply-templates select="Hours"/>
<xsl:apply-templates select="Address2"/><xsl:apply-templates select="Zip"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="Address1"/><xsl:text>   </xsl:text><xsl:apply-templates select="Zip"/><xsl:text>  </xsl:text><xsl:apply-templates select="Hours"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

然后,您可以完全跳过<Address2>.

于 2012-07-03T13:55:12.730 回答