2017-07-12 66 views
0

我需要使用XSLT动态输出来自XML文件的数据。我们有一些不同的数据结构,而不是必须显式循环每个部分,我想知道是否有一种方法可以在一个代码块中完成。这是我收到的XML的一个例子:使用XSLT输出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 

任何帮助将非常感激。谢谢。

+0

您需要为这种转变提供具体的规则。例如,应该如何在输出中呈现'LendingPartner'?如果其他部分的层次结构比此处显示的层次更深,该怎么办? –

+1

您是使用XSL-FO生成格式化的PDF还是仅生成文本?如果只是文本,'xsl-fo'标签不需要应用。 –

+0

没有更深的层次结构,LendingPartner只会像LendingPartner:str1234一样输出。这只是文字,道歉,我会删除xsl-fo标签。 –

回答

0

这里是你可以为你的出发点使用:

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