4

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

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

我尝试使用选择 >> when >> else 来查找元素,如果存在则使用该元素,或者如果该元素不在记录中,则忽略样板并插入 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>

我尝试使用选择>>当>>否则基本上忽略元素,等它们没有出现在数据中,但我的输出只显示“否则”内容。

有什么建议么?

4

1 回答 1

4
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如果存在子节点,则仅应用模板(执行处理) 。

于 2012-06-05T04:36:26.630 回答