xml - 使用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>
推荐阅读
- javascript - 如何比较决策树的单个路径?
- python - 如何在 Python 中计算箱线图中每个类别的平均值?
- python - 从相机拍摄的照片中的哈希值真的是随机的吗?
- html - 如何更新我的输入以确保它具有最新值
- php - 在 laravel 中动态创建刀片
- html - 我在使用 css 将图像与网站左侧对齐时遇到问题
- c# - Select() 在 ThenInclude() 中不起作用
- html - 使用 redux 的 MUI 自动完成
- javascript - 赛普拉斯:访问列表中的最后一项
- javascript - clearInterval 不起作用(香草 javascript)