2013-08-22 2 views
2

Вот мой XSL файл преобразования:Пустой тег после трансформации XSL

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:Message="http://schemas.microsoft.com/dynamics/2011/01/documents/Message" 
xmlns:BankPositivePay="http://schemas.microsoft.com/dynamics/2008/01/documents/BankPositivePay"> 
    <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/> 
    <xsl:template match="/"> 
    <Header> 
     <records> 
     <record> 
      <xsl:value-of select="/BankPositivePay/BankAccountTable/AccountNum"/> 
     </record> 
     </records> 
    </Header> 
    </xsl:template> 
</xsl:stylesheet> 

И входной файл XML, как:

<?xml version="1.0" encoding="UTF-8"?> 
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"> 
    <Header> 
    <MessageId>{A604C46E-F3E3-4BCB-9F7A-E8FD8749A7FC}</MessageId> 
    <Action>http://tempuri.org/BankPositivePayService/find</Action> 
    </Header> 
    <Body> 
    <MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"> 
     <BankPositivePay xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/BankPositivePay"> 
     <BankAccountTable class="entity"> 
      <AccountID>USA OPER</AccountID> 
      <AccountNum>34567</AccountNum> 
      <CurrencyCode>USD</CurrencyCode> 
      <LedgerDimension> 
      <MainAccount xmlns="http://schemas.microsoft.com/dynamics/2008/01/sharedtypes">110110</MainAccount> 
      </LedgerDimension> 
      <BankChequeTable class="entity"> 
      <AccountID>USA OPER</AccountID> 
      <AmountCur>3500.00</AmountCur> 
      <ChequeNum>1132</ChequeNum> 
      <ChequeStatus>Payment</ChequeStatus> 
      <RecipientAccountNum>1001</RecipientAccountNum> 
      <TransDate>2013-08-16</TransDate> 
      <VendTable class="entity"> 
       <Currency>USD</Currency> 
       <DefaultDimension> 
       <Values xmlns="http://schemas.microsoft.com/dynamics/2008/01/sharedtypes"> 
        <Value> 
        <Name>CustomDepartment</Name> 
        <Value>060</Value> 
        </Value> 
       </Values> 
       </DefaultDimension> 
       <VendGroup>10</VendGroup> 
      </VendTable> 
      <CompanyInfo xsi:type="AxdEntity_CompanyInfo_CompanyInfo" class="entity" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
       <DataArea>ceu</DataArea> 
      </CompanyInfo> 
      </BankChequeTable> 
     </BankAccountTable> 
     </BankPositivePay> 
    </MessageParts> 
    </Body> 
</Envelope> 

Проблема я получаю выход как:

<?xml version="1.0" encoding="utf-8"?> 
<Header xmlns:Message="http://schemas.microsoft.com/dynamics/2011/01/documents/Message" xmlns:BankPositivePay="http://schemas.microsoft.com/dynamics/2008/01/documents/BankPositivePay"> 
    <records> 
    <record></record> 
    </records> 
</Header> 

Элемент записи пуст, хотя он должен возвращать AccountNum 34567. Любая помощь приветствуется. Спасибо.

ответ

3

Есть две проблемы с вашим выберите выражение:

  1. Вы не используете пространство имен в вашем пути.
  2. Вы не местонахождение узла вы хотите

Проблема пространства имен приходит очень часто здесь. Каждый шаг селектора XPath, который нацелен на узел с непустым пространством имен URI , должен иметь префикс (если вы нацеливаете его на селектор имен).

Если изменить выражение

<xsl:value-of select="/BankPositivePay/BankAccountTable/AccountNum"/> 

в

<xsl:value-of select="//BankPositivePay:BankPositivePay/BankPositivePay:BankAccountTable/BankPositivePay:AccountNum"/> 

, то ваш выход будет

<Header xmlns:Message="http://schemas.microsoft.com/dynamics/2011/01/documents/Message" xmlns:BankPositivePay="http://schemas.microsoft.com/dynamics/2008/01/documents/BankPositivePay"> 
    <records> 
     <record>34567</record> 
    </records> 
</Header> 

// необходим, потому что элемент вы ориентируетесь не на корень. // обычно избегают, потому что это «дорого»; как именно вы нацеливаете этот узел, зависит от ваших требований.

+1

... в этот момент стоит упомянуть, что префиксы пространства имен можно свободно выбирать. Вместо 'xmlns: BankPositivePay =" ... "' using 'xmlns: bpp =" ... "' сделает для более читаемого XPath. – Tomalak

+0

@Tomalak, очень верно. это использует объявления, которые уже были в документе OP, но я определенно буду использовать более короткие префиксы. – harpo

+0

Кроме того, с XSLT 2.0 можно было использовать 'xpath-default-namespace =" ... "', чтобы работать, не повторяя большинство префиксов в остальное время. Использование 'exclude-result-prefixes' является хорошей идеей в любом случае. – Tomalak

Смежные вопросы