使用XSLT排除XML空节点
|
我有一些非常简单的
XML.我正在重新创建一些
XML并在最终的XML文件中添加一些样板文本,以便在完成后导入InDesign.
问题在于:并非所有XML字段都在每条记录中使用.因此,当XSLT添加样板文本时,它甚至会出现在不包含XML元素的记录中. 我尝试使用选择>>当>>否则要查找元素,然后使用元素if,否则忽略样板,如果元素不在记录中,则插入NOTHING. 以下是一些示例XML数据: <?xml version="1.0" encoding="UTF-8"?>
<root>
<story>
<CL>
<CityDescription>City One</CityDescription>
<BK>
<CompanyName>Corporate Name</CompanyName>
<address>123 Main St</address>
<HoldingCo>Company Name</HoldingCo>
<TotalAssets>128,319,000</TotalAssets>
<TotalLiabilities>117,059,000</TotalLiabilities>
<TotalDeposits>89,847,000</TotalDeposits>
<EquityCapital>11,260,000</EquityCapital>
</BK>
<BK>
<CompanyName>Smaller Company</CompanyName>
<address>123 Central St</address>
</BK>
</CL>
<CL>
<CityDescription>City Two</CityDescription>
<BK>
<CompanyName>Corporate Name Three</CompanyName>
<address>123 High St</address>
<HoldingCo>Company Name</HoldingCo>
<TotalAssets>128,000</EquityCapital>
</BK>
<BK>
<CompanyName>Smaller Company Four</CompanyName>
<address>123 Jones St</address>
</BK>
</CL>
</story>
</root>
这是我试图使用的XSLT,但它添加了“Holding Co:”和“Total Assets:”甚至包含不包含元素的记录: <?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="Testing.xml" -->
<!DOCTYPE xsl:stylesheet [
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="XML" />
<xsl:template match="/">
<root>
<story>
<xsl:for-each select="root/story/CL">
<CityDescription><xsl:value-of select="CityDescription"/></CityDescription><xsl:text>
</xsl:text>
<xsl:for-each select="BK">
<CompanyName><xsl:value-of select="CompanyName"/></CompanyName><xsl:text>
</xsl:text>
<address><xsl:value-of select="address"/></address><xsl:text>
</xsl:text>
<HoldingCo><xsl:text>Holding Co: </xsl:text><xsl:value-of select="HoldingCo"/></HoldingCo><xsl:text>
</xsl:text>
<TotalAssets><xsl:text>Total Assets: </xsl:text><xsl:value-of select="TotalAssets"/></TotalAssets><xsl:text>
</xsl:text>
<TotalLiabilities><xsl:text>Total Liabilities: </xsl:text><xsl:value-of select="TotalLiabilities"/></TotalLiabilities><xsl:text>
</xsl:text>
<TotalDeposits><xsl:text>Total Deposits: </xsl:text><xsl:value-of select="TotalDeposits"/></TotalDeposits><xsl:text>
</xsl:text>
<EquityCapital><xsl:text>Total Assets: </xsl:text><xsl:value-of select="EquityCapital"/></EquityCapital><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</story>
</root>
</xsl:template>
</xsl:stylesheet>
我尝试使用Choose>>当>>否则基本上忽略了元素,等等它们没有出现在数据中,但我的输出只显示“否则”内容. 有什么建议? 解决方法Here's the problem: not all XML fields are being used in every record. So,when the XSLT adds the boilerplate text it appears even in the records that don't include the XML elements. 这就是模板的用途 – 在XSLT中不使用模板就像不使用OO编程语言中的类. 这个简单的转换(请注意,没有使用过单个条件指令): <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:variable name="vNL" select="'
'"/>
<xsl:template match="/">
<root>
<story>
<xsl:apply-templates select="root/story/CL"/>
</story>
</root>
</xsl:template>
<xsl:template match="CL">
<xsl:apply-templates select="CityDescription"/>
<xsl:apply-templates select="BK"/>
</xsl:template>
<xsl:template match="CityDescription | CompanyName | address">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="BK">
<xsl:value-of select="$vNL"/>
<xsl:apply-templates select="CompanyName"/>
<xsl:apply-templates select="address"/>
<xsl:apply-templates select="HoldingCo"/>
<xsl:apply-templates select="TotalAssets"/>
<xsl:apply-templates select="TotalLiabilities"/>
<xsl:apply-templates select="TotalDeposits"/>
<xsl:apply-templates select="EquityCapital"/>
</xsl:template>
<xsl:template match="HoldingCo">
<HoldingCo>
<xsl:text>Holding Co: </xsl:text>
<xsl:value-of select="."/>
</HoldingCo>
</xsl:template>
<xsl:template match="TotalAssets">
<TotalAssets>
<xsl:text>Total Assets: </xsl:text>
<xsl:value-of select="."/>
</TotalAssets>
</xsl:template>
<xsl:template match="TotalLiabilities">
<TotalLiabilities>
<xsl:text>Total Liabilities: </xsl:text>
<xsl:value-of select="."/>
</TotalLiabilities>
</xsl:template>
<xsl:template match="TotalDeposits">
<TotalDeposits>
<xsl:text>Total Deposits: </xsl:text>
<xsl:value-of select="."/>
</TotalDeposits>
</xsl:template>
<xsl:template match="EquityCapital">
<EquityCapital>
<xsl:text>Total Assets: </xsl:text>
<xsl:value-of select="."/>
</EquityCapital>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
当应用于提供的XML文档时: <root>
<story>
<CL>
<CityDescription>City One</CityDescription>
<BK>
<CompanyName>Corporate Name</CompanyName>
<address>123 Main St</address>
<HoldingCo>Company Name</HoldingCo>
<TotalAssets>128,000</EquityCapital>
</BK>
<BK>
<CompanyName>Smaller Company Four</CompanyName>
<address>123 Jones St</address>
</BK>
</CL>
</story>
</root>
产生想要的,正确的结果: <root>
<story>
<CityDescription>City One</CityDescription>
<CompanyName>Corporate Name</CompanyName>
<address>123 Main St</address>
<HoldingCo>Holding Co: Company Name</HoldingCo>
<TotalAssets>Total Assets: 128,000</TotalAssets>
<TotalLiabilities>Total Liabilities: 117,000</TotalLiabilities>
<TotalDeposits>Total Deposits: 89,000</TotalDeposits>
<EquityCapital>Total Assets: 11,000</EquityCapital>
<CompanyName>Smaller Company</CompanyName>
<address>123 Central St</address>
<CityDescription>City Two</CityDescription>
<CompanyName>Corporate Name Three</CompanyName>
<address>123 High St</address>
<HoldingCo>Holding Co: Company Name</HoldingCo>
<TotalAssets>Total Assets: 128,000</EquityCapital>
<CompanyName>Smaller Company Four</CompanyName>
<address>123 Jones St</address>
</story>
</root>
由于BK的子元素按文档顺序处理,匹配模板可简化为: <xsl:template match="BK">
<xsl:value-of select="$vNL"/>
<xsl:apply-templates/>
</xsl:template>
这对于匹配CL的模板也是有效的 – 它可以替换为: <xsl:template match="CL">
<xsl:apply-templates/>
</xsl:template>
最后,可以完全删除此模板,因为它完全复制了与任何元素匹配的XSLT内置模板. 因此,这些重构后的转换是: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:variable name="vNL" select="'
'"/>
<xsl:template match="/">
<root>
<story>
<xsl:apply-templates select="root/story/CL"/>
</story>
</root>
</xsl:template>
<xsl:template match="CityDescription | CompanyName | address">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="BK">
<xsl:value-of select="$vNL"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="HoldingCo">
<HoldingCo>
<xsl:text>Holding Co: </xsl:text>
<xsl:value-of select="."/>
</HoldingCo>
</xsl:template>
<xsl:template match="TotalAssets">
<TotalAssets>
<xsl:text>Total Assets: </xsl:text>
<xsl:value-of select="."/>
</TotalAssets>
</xsl:template>
<xsl:template match="TotalLiabilities">
<TotalLiabilities>
<xsl:text>Total Liabilities: </xsl:text>
<xsl:value-of select="."/>
</TotalLiabilities>
</xsl:template>
<xsl:template match="TotalDeposits">
<TotalDeposits>
<xsl:text>Total Deposits: </xsl:text>
<xsl:value-of select="."/>
</TotalDeposits>
</xsl:template>
<xsl:template match="EquityCapital">
<EquityCapital>
<xsl:text>Total Assets: </xsl:text>
<xsl:value-of select="."/>
</EquityCapital>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
说明: 说明: <xsl:apply-templates select="someChildName"/> 如果存在someChildName子节点,则仅应用模板(执行处理). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
