在后续节点中插入标记的内容

时间:2014-05-26 13:39:33

标签: xml ms-access xslt

我有以下xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02">
    <CstmrDrctDbtInitn>
        <GrpHdr>
            <MsgId>PRE20140526102710000011103P</MsgId>
            <CreDtTm>2014-05-26T10:27:10</CreDtTm>
            <NbOfTxs>4</NbOfTxs>
            <CtrlSum>54.74</CtrlSum>
            <InitgPty>
                <Nm>PRESEN</Nm>
            </InitgPty>
        </GrpHdr>
        <PmtInf>
            <PmtInfId>VAF</PmtInfId>
            <PmtTpInf>
                <SvcLvl>
                    <Cd>SEPA</Cd>
                </SvcLvl>
            </PmtTpInf>
            <ReqdColltnDt>2014-05-29</ReqdColltnDt>
            <Cdtr>
                <Nm>ACRED</Nm>
            </Cdtr>
            <DrctDbtTxInf>
                <PmtId>
                    <EndToEndId>1410300003</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">14.74</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300003</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>ENRIQUE</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300003</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
            <DrctDbtTxInf>
                <PmtId>
                    <EndToEndId>1410300002</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">10.53</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300002</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>JUAN</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300002</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
        </PmtInf>
        <PmtInf>
            <PmtInfId>VAR</PmtInfId>
            <PmtTpInf>
                <SvcLvl>
                    <Cd>SEPA</Cd>
                </SvcLvl>
            </PmtTpInf>
            <ReqdColltnDt>2014-05-29</ReqdColltnDt>
            <Cdtr>
                <Nm>ACRED</Nm>
            </Cdtr>
            <DrctDbtTxInf>
                <PmtId>
                    <EndToEndId>1410300007</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">12.63</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300007</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>SERGIO</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300007</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
            <DrctDbtTxInf>
                <PmtId>
                    <EndToEndId>1410300010</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">16.84</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300010</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>MIGUEL ANGEL</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300010</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
        </PmtInf>
    </CstmrDrctDbtInitn>
</Document>

我想插入标签的内容&lt; PmtInfId&gt;在每个相应的&lt; PmtId&gt;

我搜索结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02">
    <CstmrDrctDbtInitn>
        <GrpHdr>
            <MsgId>PRE20140526102710000011103P</MsgId>
            <CreDtTm>2014-05-26T10:27:10</CreDtTm>
            <NbOfTxs>4</NbOfTxs>
            <CtrlSum>54.74</CtrlSum>
            <InitgPty>
                <Nm>PRESEN</Nm>
            </InitgPty>
        </GrpHdr>
        <PmtInf>
            <PmtInfId>VAF</PmtInfId>
            <PmtTpInf>
                <SvcLvl>
                    <Cd>SEPA</Cd>
                </SvcLvl>
            </PmtTpInf>
            <ReqdColltnDt>2014-05-29</ReqdColltnDt>
            <Cdtr>
                <Nm>ACRED</Nm>
            </Cdtr>
            <DrctDbtTxInf>
                <PmtId>
                    <PmtInfId>VAF</PmtInfId>
                    <EndToEndId>1410300003</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">14.74</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300003</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>ENRIQUE</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300003</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
            <DrctDbtTxInf>
                <PmtId>
                    <PmtInfId>VAF</PmtInfId>
                    <EndToEndId>1410300002</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">10.53</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300002</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>JUAN</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300002</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
        </PmtInf>
        <PmtInf>
            <PmtInfId>VAR</PmtInfId>
            <PmtTpInf>
                <SvcLvl>
                    <Cd>SEPA</Cd>
                </SvcLvl>
            </PmtTpInf>
            <ReqdColltnDt>2014-05-29</ReqdColltnDt>
            <Cdtr>
                <Nm>ACRED</Nm>
            </Cdtr>
            <DrctDbtTxInf>
                <PmtId>
                    <PmtInfId>VAR</PmtInfId>
                    <EndToEndId>1410300007</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">12.63</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300007</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>SERGIO</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300007</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
            <DrctDbtTxInf>
                <PmtId>
                    <PmtInfId>VAR</PmtInfId>
                    <EndToEndId>1410300010</EndToEndId>
                </PmtId>
                <InstdAmt Ccy="EUR">16.84</InstdAmt>
                <DrctDbtTx>
                    <MndtRltdInf>
                        <MndtId>TX0300010</MndtId>
                        <DtOfSgntr>2009-10-31</DtOfSgntr>
                    </MndtRltdInf>
                </DrctDbtTx>
                <Dbtr>
                    <Nm>MIGUEL ANGEL</Nm>
                </Dbtr>
                <RmtInf>
                    <Ustrd>VA-14 0300010</Ustrd>
                </RmtInf>
            </DrctDbtTxInf>
        </PmtInf>
    </CstmrDrctDbtInitn>
</Document>

我使用以下xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="PmtId">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:copy-of select="ancestor::CstmrDrctDbtInitn/PmtInf/PmtInfId"/>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

此代码改编自帖子 XSLT to change XML in MS ACCESS import 结果不是我需要的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您应该将XML命名空间添加到XSLT,结果应该是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:pain="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" exclude-result-prefixes="pain">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

    <xsl:template match="pain:PmtId">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:copy-of select="ancestor::pain:PmtInf/pain:PmtInfId"/>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

我还调整了xsl:copy-of一点,只复制了它的直接(大)父母的PmtInfId