使用 XSLT 输出 XML 结构

Posted

技术标签:

【中文标题】使用 XSLT 输出 XML 结构【英文标题】:Outputting XML structure using XSLT 【发布时间】:2017-07-12 09:44:42 【问题描述】:

我需要使用 XSLT 从 XML 文件动态输出数据。我们有几种不同的数据结构,而不是必须显式循环遍历每个部分,我想知道是否有一种方法可以在一个代码块中完成。这是我将收到的 XML 示例:

        <IntermediaryInfo>
            <PersonalInformation>
                <Title>str1234</Title>
                <FirstName>str1234</FirstName>
                <Surname>str1234</Surname>
                <DateofBirth>2012-12-13</DateofBirth>
                <WorkTelephoneNumber>str1234</WorkTelephoneNumber>
            </PersonalInformation>
            <CompanyInformation>
                <CompanyName>str1234</CompanyName>
                <CompanyFCANumber>str1234</CompanyFCANumber>
            </CompanyInformation>
            <CompanyAddress>
                <PostCode>str1234</PostCode>
                <HouseNumber>str1234</HouseNumber>
                <HouseName>str1234</HouseName>
                <AddressLine1>str1234</AddressLine1>
                <AddressLine2>str1234</AddressLine2>
            </CompanyAddress>
            <CompanyPermissionLevels>
                <AdvisingonConsumer>str1234</AdvisingonConsumer>
                <ArrangingConsumerBuytoLetmortgageContracts>str1234</ArrangingConsumerBuytoLetmortgageContracts>
            </CompanyPermissionLevels>
            <PrincipleFirm>
                <FirmName>str1234</FirmName>
                <FirmFCANumber>123</FirmFCANumber>
            </PrincipleFirm>
            <LendingPartner>str1234</LendingPartner>
        </IntermediaryInfo>

有没有办法遍历每个节点并使用 XSLT 输出节点名称和值?所以它看起来像这样:

    PersonalInformation
    -------------------
    Title: str1234
    FirstName: str1234
    Surname: str1234
    DateofBirth: 2012-12-13
    WorkTelephoneNumber: str1234

    CompanyInformation
    ------------------
    CompanyName: str1234
    CompanyFCANumber: str1234

任何帮助将不胜感激。谢谢。

【问题讨论】:

您需要为此类转换提供特定规则。例如,LendingPartner 应该如何在输出中呈现?如果其他部分的层次结构比此处显示的更深怎么办? 您是使用 XSL-FO 生成格式化的 PDF 还是仅生成文本?如果只是文本,则不需要应用“xsl-fo”标签。 没有更深层次的层次结构,LendingPartner 的输出与其余部分相同,如 LendingPartner: str1234。只是文字,抱歉,我将删除 xsl-fo 标记。 "LendingPartner 的输出与其他输出相同" 但是在什么标题下? 哦,对了,对不起,它没有标题,任何没有父标签的标签都将作为标题本身输出,如下面的答案所示。 【参考方案1】:

以下是您可以作为起点的内容:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:param name="indent"/>
    <xsl:value-of select="$indent" />
    <xsl:value-of select="name()" />
    <xsl:text>&#10;</xsl:text>
    <xsl:apply-templates>
        <xsl:with-param name="indent" select="concat($indent, '&#9;')"/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="*[text()]">
    <xsl:param name="indent"/>
    <xsl:value-of select="$indent" />
    <xsl:value-of select="name()" />
    <xsl:text>: </xsl:text>
    <xsl:value-of select="." />
    <xsl:text>&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

IntermediaryInfo
    PersonalInformation
        Title: str1234
        FirstName: str1234
        Surname: str1234
        DateofBirth: 2012-12-13
        WorkTelephoneNumber: str1234
    CompanyInformation
        CompanyName: str1234
        CompanyFCANumber: str1234
    CompanyAddress
        PostCode: str1234
        HouseNumber: str1234
        HouseName: str1234
        AddressLine1: str1234
        AddressLine2: str1234
    CompanyPermissionLevels
        AdvisingonConsumer: str1234
        ArrangingConsumerBuytoLetmortgageContracts: str1234
    PrincipleFirm
        FirmName: str1234
        FirmFCANumber: 123
    LendingPartner: str1234

【讨论】:

以上是关于使用 XSLT 输出 XML 结构的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV

使用 XSLT 创建 PLSQL 语句以输出 XML

XSLT

如何在保持结构的同时使用 xslt 重新排序 xml 文件

包含 ∈ 的 XML 文档无效 - 如何使用 XSLT 输出?

使用XSLT输出未格式化的XML