引用重复标记

时间:2017-10-20 15:20:36

标签: xml xslt

我非常感谢能帮助解决我的问题。

请帮助我在网上寻找工作或类似的例子,但找不到任何东西。

我已收到以下xml导入我们的系统:

<Address addressOrg="Import">
<Name>Sams Shop</Name>
<AddressOrg>01 Red Road</AddressOrg>
<AddressOrg>Summer Town</AddressOrg>
<City></City>
<Province></Province>
<Postcode></Postcode>
<Country>
<CountryCode></CountryCode>
</Country>
<AccountNumber></AccountNumber>
</Address>
<Address addressOrg="Exporter">
<Name>PToms Shop</Name>
<AddressOrg>01 Blue Road</AddressOrg>
<AddressOrg>Snow Town</AddressOrg>
<City></City>
<Province></Province>
<Postcode></Postcode>
<Country>
<CountryCode></CountryCode>
</Country>
<AccountNumber></AccountNumber>
</Address>

我正在尝试完成下面的xslt:

<OrgsAddressCollection>
          <OrganizationAddress>
            <AddressType>ConsigneeDeliveryAddress</AddressType>
            <Address1><xsl:value-of select="Address/AddressOrg"/></Address1>
            <Address2><xsl:value-of select="Address/AddressOrg"/></Address2>
            <CompanyName><xsl:value-of select="Address/Name"/>/CompanyName>
            <Fax />
            <OrganizationCode />
            <Phone />
          </OrganizationAddress>
          <OrganizationAddress>
            <AddressType>ConsignorDDeliveryAddress</AddressType>
            <Address1><xsl:value-of select="Address/AddressOrg"/></Address1>
            <Address2><xsl:value-of select="Address/AddressOrg"/></Address2>
            <CompanyName><xsl:value-of select="Address/Name"/></CompanyName>
            <Fax />
            <OrganizationCode />
            <Phone />
          </OrganizationAddress>
<OrgsAddressCollection>

上述问题是因为标签名称与第一个相同 当我使用上面的代码引用它时,地址数据集似乎也在拉到第二个地址。

我希望上面的xslt输出以下转换后的结果:

<OrgsAddressCollection>
          <OrganizationAddress>
            <AddressType>ConsigneeDeliveryAddress</AddressType>
            <Address1>01 Red Road</Address1>
            <Address2>Summer Town</Address2>
            <CompanyName>Sams Shop</CompanyName>
            <Fax />
            <OrganizationCode />
            <Phone />
          </OrganizationAddress>
          <OrganizationAddress>
            <AddressType>ConsignorDDeliveryAddress</AddressType>
            <Address1>01 Blue ROad</Address1>
            <Address2>Snow Town</Address2>
            <CompanyName>Toms Shop</CompanyName>
            <Fax />
            <OrganizationCode />
            <Phone />
          </OrganizationAddress>
<OrgsAddressCollection>

1 个答案:

答案 0 :(得分:2)

执行<xsl:value-of select="Address/AddressOrg" />只会获得第一个Address元素,以及第一个AddressOrg

也许您的案例中只会有两个地址,但要避免过多的重复编码,并使其更加灵活,您可以在此使用xsl:for-each(或xsl:apply-templates

<xsl:for-each select="Address">
  <OrganizationAddress>

并且,在此范围内,您可以通过在方括号中指定相关元素的位置来获得两个AddressOrd元素(请注意您现在所在的xsl:for-eachAddress元件)

<Address1><xsl:value-of select="AddressOrg[1]"/></Address1>
<Address2><xsl:value-of select="AddressOrg[2]"/></Address2>

要根据输入自定义某些输出标签,您还可以使用xsl:choose

试试这个XSLT片段

<OrgsAddressCollection>
  <xsl:for-each select="Address">
    <OrganizationAddress>
      <AddressType>
         <xsl:choose>
            <xsl:when test="@addressOrg = 'Import'">ConsigneeDeliveryAddress</xsl:when>
            <xsl:when test="@addressOrg = 'Exporter'">ConsignorDDeliveryAddress</xsl:when>
        </xsl:choose>
      </AddressType>
      <Address1><xsl:value-of select="AddressOrg[1]"/></Address1>
      <Address2><xsl:value-of select="AddressOrg[2]"/></Address2>
      <CompanyName><xsl:value-of select="Name"/></CompanyName>
      <Fax />
      <OrganizationCode />
      <Phone />
    </OrganizationAddress>
  </xsl:for-each>
</OrgsAddressCollection>