簡體   English   中英

使用 xslt 從父節點重復元素到子節點

[英]Repeat element from parent into child node with xslt

我正在嘗試編寫一個 xsl 文件以方便將 xml 文件導入數據庫。 因此,我需要將父節點的 id 復制到子節點,以便它們在導入后用作外鍵。

輸入 XML 是:

<?xml version="1.0" encoding="utf-8"?>
<RequestedDoc xmlns:icls="https://www.aade.gr/myDATA/incomeClassificaton/v1.0" xmlns:ecls="https://www.aade.gr/myDATA/expensesClassificaton/v1.0" xmlns="http://www.aade.gr/myDATA/invoice/v1.0">
  <invoicesDoc>
    <invoice>
      <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
      <mark>400000090600432</mark>
      <issuer>
        <vatNumber>117570526</vatNumber>
        <country>GR</country>
        <branch>0</branch>
      </issuer>
      <counterpart>
        <vatNumber>090027010</vatNumber>
        <country>GR</country>
        <branch>0</branch>
      </counterpart>
      <invoiceHeader>
        <series>0</series>
        <aa>1</aa>
        <issueDate>2020-10-05</issueDate>
        <invoiceType>1.1</invoiceType>
        <vatPaymentSuspension>false</vatPaymentSuspension>
        <currency>EUR</currency>
      </invoiceHeader>
      <paymentMethods>
        <paymentMethodDetails>
          <type>3</type>
          <amount>1</amount>
        </paymentMethodDetails>
      </paymentMethods>
      <invoiceDetails>
        <lineNumber>1</lineNumber>
        <netValue>1</netValue>
        <vatCategory>7</vatCategory>
        <vatAmount>0</vatAmount>
        <vatExemptionCategory>8</vatExemptionCategory>
        <discountOption>true</discountOption>
        <incomeClassification>
          <icls:classificationType>E3_561_001</icls:classificationType>
          <icls:classificationCategory>category1_3</icls:classificationCategory>
          <icls:amount>1</icls:amount>
        </incomeClassification>
      </invoiceDetails>
      <invoiceSummary>
        <totalNetValue>1</totalNetValue>
        <totalVatAmount>0</totalVatAmount>
        <totalWithheldAmount>0</totalWithheldAmount>
        <totalFeesAmount>0</totalFeesAmount>
        <totalStampDutyAmount>0</totalStampDutyAmount>
        <totalOtherTaxesAmount>0</totalOtherTaxesAmount>
        <totalDeductionsAmount>0</totalDeductionsAmount>
        <totalGrossValue>1</totalGrossValue>
        <incomeClassification>
          <icls:classificationType>E3_561_001</icls:classificationType>
          <icls:classificationCategory>category1_3</icls:classificationCategory>
          <icls:amount>1</icls:amount>
        </incomeClassification>
      </invoiceSummary>
    </invoice>
  </invoicesDoc>
</RequestedDoc>

我正在嘗試獲得此輸出:

<?xml version="1.0" encoding="utf-8"?>
<RequestedDoc xmlns:icls="https://www.aade.gr/myDATA/incomeClassificaton/v1.0" xmlns:ecls="https://www.aade.gr/myDATA/expensesClassificaton/v1.0" xmlns="http://www.aade.gr/myDATA/invoice/v1.0">
  <invoicesDoc>
    <invoice>
      <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
      <mark>400000090600432</mark>
      <issuer>
        <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
        <vatNumber>117570526</vatNumber>
        <country>GR</country>
        <branch>0</branch>
      </issuer>
      <counterpart>
        <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
        <vatNumber>090027010</vatNumber>
        <country>GR</country>
        <branch>0</branch>
      </counterpart>
      <invoiceHeader>
        <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
        <series>0</series>
        <aa>1</aa>
        <issueDate>2020-10-05</issueDate>
        <invoiceType>1.1</invoiceType>
        <vatPaymentSuspension>false</vatPaymentSuspension>
        <currency>EUR</currency>
      </invoiceHeader>
      <paymentMethods>
        <paymentMethodDetails>
          <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
          <type>3</type>
          <amount>1</amount>
        </paymentMethodDetails>
      </paymentMethods>
      <invoiceDetails>
        <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
        <lineNumber>1</lineNumber>
        <netValue>1</netValue>
        <vatCategory>7</vatCategory>
        <vatAmount>0</vatAmount>
        <vatExemptionCategory>8</vatExemptionCategory>
        <discountOption>true</discountOption>
        <incomeClassification>
          <icls:classificationType>E3_561_001</icls:classificationType>
          <icls:classificationCategory>category1_3</icls:classificationCategory>
          <icls:amount>1</icls:amount>
        </incomeClassification>
      </invoiceDetails>
      <invoiceSummary>
        <uid>F2D232C83627739466261DBD96A355074E7FE591</uid>
        <totalNetValue>1</totalNetValue>
        <totalVatAmount>0</totalVatAmount>
        <totalWithheldAmount>0</totalWithheldAmount>
        <totalFeesAmount>0</totalFeesAmount>
        <totalStampDutyAmount>0</totalStampDutyAmount>
        <totalOtherTaxesAmount>0</totalOtherTaxesAmount>
        <totalDeductionsAmount>0</totalDeductionsAmount>
        <totalGrossValue>1</totalGrossValue>
        <incomeClassification>
          <icls:classificationType>E3_561_001</icls:classificationType>
          <icls:classificationCategory>category1_3</icls:classificationCategory>
          <icls:amount>1</icls:amount>
        </incomeClassification>
      </invoiceSummary>
    </invoice>
  </invoicesDoc>
</RequestedDoc>

為此,我編寫了以下代碼:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes"/>  
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="issuer | counterpart | invoiceHeader | paymentMethods/paymentMethodDetails | invoiceDetails | invoiceSummary">
        <issuer>
            <uid><xsl:value-of select="/RequestedDoc/invoicesDoc/invoice/uid"/></uid>
            <xsl:apply-templates/>
        </issuer>
    </xsl:template>
    
</xsl:stylesheet>

但它不起作用。 任何人都可以幫忙嗎?

缺少默認的命名空間處理。 我還簡化了您的第二個模板。

請嘗試以下 XSLT。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.aade.gr/myDATA/invoice/v1.0" xmlns:a="http://www.aade.gr/myDATA/invoice/v1.0" xmlns:icls="https://www.aade.gr/myDATA/incomeClassificaton/v1.0"
                xmlns:ecls="https://www.aade.gr/myDATA/expensesClassificaton/v1.0" exclude-result-prefixes="a">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="a:issuer | a:counterpart | a:invoiceHeader | a:paymentMethodDetails | a:invoiceDetails | a:invoiceSummary">
        <xsl:copy>
         <xsl:copy-of select="/a:RequestedDoc/a:invoicesDoc/a:invoice/a:uid"/>
         <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM