XSL Transformer不会选择具有相对路径的标记值

时间:2017-01-04 06:02:28

标签: xml xslt xslt-1.0

我在从XSL转换器中选择XML的值时遇到了问题。 我正在转换的XML如下所示。

<?xml version="1.0" encoding="utf-8"?>
<message creationDateTime="2012-12-31T12:25:21Z" id="20121231122504.f555357c-bcc1-483d-93ea-29551a2dc52f" xmlns="urn:netdocs:schemas:message">
  <sender xmlns="">
    <id entityIdTypeCoded="GLN">5600000000427</id>
    <addressInformation>
      <countryCode>PT</countryCode>
    </addressInformation>
  </sender>
  <receiver xmlns="">
    <id entityIdTypeCoded="GLN">560000001XXXX</id>
    <addressInformation>
      <countryCode>PT</countryCode>
    </addressInformation>
  </receiver>
  <order documentNumber="000123285849" documentDate="2012-12-31" schemaVersion="1.0" xmlns="urn:netdocs:schemas:document">  
    <seller xmlns="">
      <id entityIdTypeCoded="GLN">560000001XXXX</id>
      <name>TUDO BEM SA</name>
      <addressInformation>
        <address></address>
        <city></city>
        <postalCode>
          <zip></zip>
          <area></area>
        </postalCode>
        <countryCode>PT</countryCode>
      </addressInformation>
    </seller>
    <buyer xmlns="">
      <id entityIdTypeCoded="GLN">5600000022078</id>
      <name>ENT. ALV FARMACIA</name>
      <addressInformation>
        <address></address>
        <city></city>
        <postalCode>
          <zip></zip>
          <area></area>
        </postalCode>
        <countryCode>PT</countryCode>
      </addressInformation>
    </buyer>
    <billTo xmlns="">
      <id entityIdTypeCoded="GLN">5600000000403</id>
      <name>Modelo Continente Hipermercados, SA </name>
      <addressInformation>
        <address></address>
        <city></city>
        <postalCode>
          <zip></zip>
          <area></area>
        </postalCode>
        <countryCode>PT</countryCode>
      </addressInformation>
    </billTo>
    <shipTo xmlns="">
      <id entityIdTypeCoded="GLN">5600000022078</id>
      <name>ENT. ALV FARMACIA</name>
      <addressInformation>
        <address></address>
        <city></city>
        <postalCode>
          <zip></zip>
          <area></area>
        </postalCode>
        <countryCode>PT</countryCode>
      </addressInformation>
    </shipTo>
    <additionalDate type="DELIVERY" xmlns="">2013-01-03T10:30:00</additionalDate>
    <currencyCode xmlns="">EUR</currencyCode>
    <lineItem number="1" xmlns="">
      <gtinCode>0083800004XXX</gtinCode>
      <buyerItemCode>3798XXX</buyerItemCode>
      <description>PRODUTO XX 2X6L</description>
      <quantity>
        <value>80</value>
        <unitOfMeasure>EA</unitOfMeasure>
      </quantity>
      <netUnitPrice>0.00</netUnitPrice>
      <quantityOfPackages>
        <value>80</value>
        <packageType>BX</packageType>
        <quantityPerPackage>96</quantityPerPackage>
      </quantityOfPackages>
      <vatPercentage>23</vatPercentage>
      <netAmount>0</netAmount>
    </lineItem>
    <lineItem number="2" xmlns="">
      <gtinCode>0083800004XXX</gtinCode>
      <buyerItemCode>3798XXX</buyerItemCode>
      <description>PRODUTO XX 2X6ML</description>
      <quantity>
        <value>80</value>
        <unitOfMeasure>EA</unitOfMeasure>
      </quantity>
      <netUnitPrice>0.00</netUnitPrice>
      <quantityOfPackages>
        <value>10</value>
        <packageType>BX</packageType>
        <quantityPerPackage>96</quantityPerPackage>
      </quantityOfPackages>
      <vatPercentage>23</vatPercentage>
      <netAmount>0</netAmount>
    </lineItem>
  </order>
</message>

我试图获取// order / additionalDate的值和order tag的属性documentNumber的值。我尝试过使用下面的XSLT。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:me="urn:netdocs:schemas:message" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" version="1.0">
<xsl:output method="xml" indent="yes"/>

   <xsl:template match="text()" />

   <xsl:template match="/">

      <xsl:text>&#xa;</xsl:text>
      <WANTED_DELIVERY_DATE>
            <xsl:value-of select="//order/additionalDate" />
      </WANTED_DELIVERY_DATE>

      <xsl:text>&#xa;</xsl:text>
      <CUSTOMER_PO_NO>
            <xsl:value-of select="//order/@documentNumber" />
      </CUSTOMER_PO_NO>

   </xsl:template>

</xsl:stylesheet>

但它只为我提供了两个空标签。

这可能是什么问题?

谢谢...

1 个答案:

答案 0 :(得分:2)

您的问题是您没有考虑默认名称空间(没有前缀声明的名称空间)。

order位于名称空间urn:netdocs:schemas:document中(称为名称空间uri)。

additionalDate位于空名称空间中。

尝试这样的事情:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:msg="urn:netdocs:schemas:message"
  xmlns:doc="urn:netdocs:schemas:document"
  exclude-result-prefixes="msg doc">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/msg:message">
    <WANTED_DELIVERY_DATE>
      <xsl:value-of select="doc:order/additionalDate" />
    </WANTED_DELIVERY_DATE>
    <CUSTOMER_PO_NO>
      <xsl:value-of select="doc:order/@documentNumber" />
    </CUSTOMER_PO_NO>
  </xsl:template>

</xsl:stylesheet>

请注意,我将messageorder的命名空间绑定到前缀(msgdoc)。 (只要URI相同,您就可以使用不同的前缀。)

另请注意,additionalDate不需要前缀,因为它位于空命名空间中。

有关名称空间的更多信息,请查看: