我需要有关xslt 2.0中身份模板转换的帮助,我现在尝试了几个小时,但未能实现。
输入
<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>16</MsgId>
</GrpHdr>
<PmtInf>
<PmtInfId>161</PmtInfId>
<PmtMtd>TRF</PmtMtd>
<BtchBookg>false</BtchBookg>
<NbOfTxs>1</NbOfTxs>
<CtrlSum>0.01</CtrlSum>
<ChrgBr>SL</ChrgBr>
<CdtTrfTxInf>
<PmtId>
<InstrId>EFT</InstrId>
</PmtId>
<Purp>
<Prtry>DEP</Prtry>
</Purp>
<RmtInf>
<Strd>
<RfrdDocInf>
<Tp>
<CdOrPrtry>
<Cd>SOAC</Cd>
</CdOrPrtry>
</Tp>
<Nb>643525145</Nb>
<RltdDt>2018-01-01-07:00</RltdDt>
</RfrdDocInf>
<RfrdDocAmt>
<DuePyblAmt Ccy="EUR">0.01</DuePyblAmt>
<RmtdAmt Ccy="EUR">0.01</RmtdAmt>
</RfrdDocAmt>
<CdtrRefInf>
<Ref>643525145</Ref>
</CdtrRefInf>
</Strd>
</RmtInf>
</CdtTrfTxInf>
</PmtInf>
</CstmrCdtTrfInitn>
</Document>
输出
<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>16</MsgId>
</GrpHdr>
<PmtInf>
<PmtInfId>161</PmtInfId>
<PmtMtd>TRF</PmtMtd>
<BtchBookg>false</BtchBookg>
<NbOfTxs>1</NbOfTxs>
<CtrlSum>0.01</CtrlSum>
<ChrgBr>SL</ChrgBr>
<CdtTrfTxInf>
<PmtId>
<InstrId>EFT</InstrId>
</PmtId>
<Purp>
<Prtry>DEP</Prtry>
</Purp>
<RmtInf>
<Ustrd>643525145</Ustrd>
</RmtInf>
</CdtTrfTxInf>
</PmtInf>
</CstmrCdtTrfInitn>
</Document>
如果xpath / Document / CstmrCdtTrfInitn / PmtInf / CdtTrfTxInf / RmtInf / Strd / RfrdDocInf / Nb 和 / Document / CstmrCdtTrfInitn / PmtInf / CdtTrfTxInd / R / strong>是相同的,那么我需要如上所述的输出。如果它们不相同,则xslt必须按原样返回输入数据,而无需更改。
到目前为止,我已经尝试过此xslt代码,但是没有用。
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:template match='@* | node()'>
<xsl:copy>
<xsl:apply-templates select='@* | node()'/>
</xsl:copy>
<!--/xsl:if-->
</xsl:template>
<xsl:template match='Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/RmtInf'>
<xsl:if test="Strd/RfrdDocInf/Nb=Strd/CdtrRefInf/Ref">
<xsl:copy>
<Ustrd>
<xsl:value-of select="Strd/CdtrRefInf/Ref"/>
</Ustrd>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
请有人帮助我实现目标,谢谢。
答案 0 :(得分:1)
您已在XSLT中指定了默认名称空间,但这仅适用于您在XSLT中创建的无前缀元素(即<Ustrd>
标记),但不适用于您的XPath表达式模板匹配。这意味着您的模板没有匹配任何元素,因此也没有被使用。
在使用XSLT 2.0时,只需在XSLT中添加xpath-default-namespace
即可解决此问题,这样xpath表达式中所有未前缀的元素都将被视为该命名空间。
尝试使用此XSLT
<xsl:stylesheet version="2.0"
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
xpath-default-namespace="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="xsi">
<xsl:template match='@* | node()'>
<xsl:copy>
<xsl:apply-templates select='@* | node()'/>
</xsl:copy>
</xsl:template>
<xsl:template match='Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/RmtInf'>
<xsl:if test="Strd/RfrdDocInf/Nb=Strd/CdtrRefInf/Ref">
<xsl:copy>
<Ustrd>
<xsl:value-of select="Strd/CdtrRefInf/Ref"/>
</Ustrd>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>