【问题标题】:Name space in XSLTXSLT 中的名称空间
【发布时间】:2010-07-08 17:53:14
【问题描述】:

下面是示例文件

<?xml version='1.0' encoding='UTF-8'?>
<Document xmlns='urn:iso:std:iso:20022:tech:xsd:pain.002.001.02' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>  
<pain.002.001.02>
------------
-------------
-------------

</pain.002.001.02>
</Document> 

以下是 XSLT 转换代码:

<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:sap="http://www.sap.com/sapxsl"
  xmlns:asx="http://www.sap.com/abapxml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<xsl:strip-space elements="*"/>

<xsl:template match="/">


<asx:abap version="1.0">
<asx:values>

 <xsl:for-each select="Document/pain.002.001.02">
<ACK_HEADER>
<ZTFI_PYSTATUS_HD>
  <xsl:for-each select="GrpHdr[1]">
  <ORGNLMSG_ID><xsl:value-of select="MsgId"/></ORGNLMSG_ID>
<!--  <MSG_CRTD_DATE><xsl:value-of select="CreDtTm"/></MSG_CRTD_DATE>-->
<xsl:variable name="date_time" select="CreDtTm"/>
<MSG_CRTD_DATE><xsl:value-of select="substring-before(@T,',$date_time')"/></MSG_CRTD_DATE>
<!--Payment Acknowledgement Header data-->
</xsl:for-each>

<xsl:for-each select="OrgnlGrpInfAndSts[1]">
<MSGID><xsl:value-of select="OrgnlMsgId"/></MSGID>
<xsl:variable name="msgid" select="OrgnlMsgId"/>
<ORIGNLMSG_NM_ID><xsl:value-of select="OrgnlMsgNmId"/></ORIGNLMSG_NM_ID>
<ORGNL_NO_OF_TRAN><xsl:value-of select="OrgnlNbOfTxs"/></ORGNL_NO_OF_TRAN>
<ORGNL_CNTRL_SUM><xsl:value-of select="OrgnlCtrlSum"/></ORGNL_CNTRL_SUM>
<ORGNL_FILE_STAT><xsl:value-of select="GrpSts"/></ORGNL_FILE_STAT>
<xsl:for-each select="NbOfTxsPerSts">
<xsl:choose>
<xsl:when test="DtldSts='ACSP'">
<ORGNL_NO_OF_ACSP><xsl:value-of select="DtldNbOfTxs"/></ORGNL_NO_OF_ACSP>
<ORGNL_ACSP_SUM><xsl:value-of select="DtldCtrlSum"/></ORGNL_ACSP_SUM>
</xsl:when>
<xsl:when test="DtldSts='RJCT'">
<ORGNL_NO_OF_RJCT><xsl:value-of select="DtldNbOfTxs"/></ORGNL_NO_OF_RJCT>
<ORGNL_RJCT_SUM><xsl:value-of select="DtldCtrlSum"/></ORGNL_RJCT_SUM>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</ZTFI_PYSTATUS_HD>
</ACK_HEADER>
<ACK_DETAIL>

<!--Payment Acknowledgement Detail data-->

<xsl:for-each select="TxInfAndSts">
<ZTFI_PYSTATUS_DT>
<MSGID><xsl:value-of select="$msgid"/></MSGID>
<PMT_INFO_IDENT><xsl:value-of select="OrgnlPmtInfId"/></PMT_INFO_IDENT>
<END_2_END_ID><xsl:value-of select="OrgnlEndToEndId"/></END_2_END_ID>
<TRAN_STATUS><xsl:value-of  select="TxSts"/></TRAN_STATUS>
<INSTRU_IDENT><xsl:value-of select="OrgnlInstrId"/></INSTRU_IDENT>
<xsl:for-each select="StsRsnInf[1]">
<STAT_RE_AD_INFO><xsl:value-of select="AddtlStsRsnInf"/></STAT_RE_AD_INFO>
</xsl:for-each>
<xsl:for-each select="OrgnlTxRef[1]">
<xsl:for-each select="Amt[1]">
<xsl:for-each select="InstdAmt[1]">
<INSTRCTD_AMT><xsl:value-of select="string()"/></INSTRCTD_AMT>
<CURRENCY><xsl:value-of select="@Ccy"/></CURRENCY>
</xsl:for-each>
</xsl:for-each>
<REQ_EXEC_DATE><xsl:value-of select="ReqdExctnDt"/></REQ_EXEC_DATE>
<xsl:for-each select="CdtrAcct[1]">
<xsl:for-each select="Id[1]">
<xsl:for-each select="PrtryAcct[1]">
<LIFNR><xsl:value-of select="Id"/></LIFNR>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>


</xsl:for-each>
</ZTFI_PYSTATUS_DT>
</xsl:for-each>
</ACK_DETAIL>
</xsl:for-each>
</asx:values>
</asx:abap>
</xsl:template>
</xsl:transform>

当我从 XML 文件中排除以下字符串(在 Document 标记中)时,我可以进行转换。

'xmlns='urn:iso:std:iso:20022:tech:xsd:pain.002.001.02' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> 

但是当我包含相同的字符串时,我的 XSLT 转换。它不工作。

请做必要的事。

感谢和问候, 基兰。

【问题讨论】:

  • @kiram puram:为什么要使用这么多for-each 指令?这不是对待语言的方式!也许您会在一个过程中用“C”编写一个程序?请发布完整的输入示例,也许有人可以帮助您编写代码。这将有助于未来的代码维护。

标签: xslt transform


【解决方案1】:

在您的 xsl 声明中添加您的 xml 文档命名空间

<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:sap="http://www.sap.com/sapxsl"
  xmlns:asx="http://www.sap.com/abapxml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:doc='urn:iso:std:iso:20022:tech:xsd:pain.002.001.02'
>

并通过前缀doc: 引用您的节点。例如:

<xsl:for-each select="doc:pain.002.001.02">

编辑 对于您的问题,请尝试:

<xsl:for-each select="doc:Document/doc:pain.002.001.02">

【讨论】:

  • 您好 Gregoire,感谢您的快速回复。我已经更改了代码,但仍然无法正常工作。下面是更改代码: w3.org/1999/XSL/Transform" xmlns:sap="sap.com/sapxsl" xmlns:asx="sap.com/abapxml" xmlns:doc='urn:iso :std:iso:20022:tech:xsd:pain.002.001.02' xmlns:xsi="w3.org/2001/XMLSchema-instance"> 请帮帮我出去。谢谢和问候,基兰。
【解决方案2】:

这是一个常见问题解答。 XPath 将不带前缀的元素名称视为属于“无命名空间”。

只要 XML 文档具有默认命名空间,按名称引用元素的唯一方法就是将它们作为前缀引用,其中前缀绑定到默认命名空间。

这意味着

  1. 将前缀(比如“xxx”)关联到文档的默认命名空间。

  2. 在任何 XPath 表达式或匹配模式中,将每个元素名称替换为相应的前缀名称。例如,将/a/b/c/d 替换为/xxx:a/xxx:b/xxx:c/xxx:d

在严格遵守上述两条规则后,修改后的样式表将按预期运行:与应用于没有默认命名空间的 XML 文档的原始样式表相同。

【讨论】:

  • 您好 Dimitre Novatchev/Gregoire,现在已解决。非常感谢您的快速帮助。感谢和问候,问候,Kiran。
  • kiran-puram:很高兴解决了。在 StackOverflow (SO)。提出问题的人通常接受其中一个答案(通过单击答案旁边的复选标记)。我相信你不知道... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多