gpt4 book ai didi

xml - 使用 XSLT 排除 XML 空节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:06:49 26 4
gpt4 key购买 nike

我有一些非常简单的 XML。我正在重新创建一些 XML 并将一些样板文本添加到最终的 XML 文件中,以便在完成后导入到 InDesign 中。

问题在于:并不是每条记录都使用了所有 XML 字段。因此,当 XSLT 添加样板文本时,它甚至会出现在不包含 XML 元素的记录中。

我尝试使用 choose >> when >> otherwise 来查找元素,如果存在则使用该元素,或者如果元素不在记录中则忽略样板并插入 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,319,000</TotalAssets>
<TotalLiabilities>117,059,000</TotalLiabilities>
<TotalDeposits>89,847,000</TotalDeposits>
<EquityCapital>11,260,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 >> When >> Otherwise 基本上忽略没有出现在数据中的元素等,但我的输出只显示“否则”内容。

有什么建议吗?

最佳答案

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="'&#xA;'"/>
<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,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,319,000</TotalAssets>
<TotalLiabilities>117,059,000</TotalLiabilities>
<TotalDeposits>89,847,000</TotalDeposits>
<EquityCapital>11,260,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,319,000</TotalAssets>
<TotalLiabilities>Total Liabilities: 117,059,000</TotalLiabilities>
<TotalDeposits>Total Deposits: 89,847,000</TotalDeposits>
<EquityCapital>Total Assets: 11,260,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,319,000</TotalAssets>
<TotalLiabilities>Total Liabilities: 117,059,000</TotalLiabilities>
<TotalDeposits>Total Deposits: 89,847,000</TotalDeposits>
<EquityCapital>Total Assets: 11,260,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="'&#xA;'"/>
<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 子节点存在时应用模板(执行处理)。

关于xml - 使用 XSLT 排除 XML 空节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10891248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com