2017-07-14 91 views
0

为什么打印标签时的所有内容?我只想进入该节点,因此我不必一直键入路径?下面是示例XML:模板匹配打印匹配标签的所有内容

  <?xml version="1.0" encoding="UTF-8"?> 
<Document xmlns="blablabla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <CstmrCdtTrfInitn> 
     <GrpHdr> 
     <MsgId>35006</MsgId> 
     <CreDtTm>2017-04-13T08:30:09</CreDtTm> 
     <NbOfTxs>3</NbOfTxs> 
     <CtrlSum>22000.00</CtrlSum> 
     <InitgPty> 
      <Nm>XXXXX</Nm> 
      <Id> 
       <OrgId> 
        <Othr> 
        <Id>0000010681</Id> 
        </Othr> 
       </OrgId> 
      </Id> 
     </InitgPty> 
     </GrpHdr> 
     <PmtInf> 
     <PmtInfId>35006_26011</PmtInfId> 
     <PmtMtd>TRF</PmtMtd> 
     <NbOfTxs>3</NbOfTxs> 
     <CtrlSum>22000.00</CtrlSum> 
     <PmtTpInf /> 
     <ReqdExctnDt>2017-04-13</ReqdExctnDt> 
     <Dbtr> 
      <Nm>WWWWWWW</Nm> 
      <PstlAdr> 
       <StrtNm>AAAAAA</StrtNm> 
       <PstCd>BBBBBB</PstCd> 
       <TwnNm>CCCCCC</TwnNm> 
       <Ctry>PL</Ctry> 
      </PstlAdr> 
      <Id> 
       <OrgId> 
        <Othr> 
        <Id>0000010681</Id> 
        </Othr> 
       </OrgId> 
      </Id> 
     </Dbtr> 
     </PmtInf> 
    </CstmrCdtTrfInitn> 
</Document> 

这里是我想收到什么:

1. XXXXX 
2. AAAAAA 
3. BBBBBB 
4. CCCCCC 

而且我越来越:

350062017-04-13T08:30:09322000.00XXXXX0000010681 
    1. 
    WWWWWWW 
    2. 
    AAAAAA 
    3. 
    BBBBBB 
    4. 
    CCCCCC 

使用此XLST:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="blablabla" version="1.0"> 
    <xsl:output method="text" encoding="utf-8" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="doc:PmtInf"> 
     1. 
     <xsl:value-of select="doc:Dbtr/doc:Nm" /> 
     2. 
     <xsl:value-of select="doc:Dbtr/doc:PstlAdr/doc:StrtNm" /> 
     3. 
     <xsl:value-of select="doc:Dbtr/doc:PstlAdr/doc:PstCd" /> 
     4. 
     <xsl:value-of select="doc:Dbtr/doc:PstlAdr/doc:TwnNm" /> 
    </xsl:template> 
</xsl:stylesheet> 

回答

-1

变更

 <xsl:value-of select="doc:Dbtr/doc:Nm" /> 

 <xsl:value-of select="ancestor-or-self::Document/CstmrCdtTrfInitn/GrpHdr/InitgPty/Nm" /> 

祖先或自身给你possebility从XML文档的顶部节点选择

+0

此无关的问题,并不能解决任何问题 - 相反。 –

+0

它确实实现了他所描述的他想要的。但我可能会误解这个问题。 – Casper

+0

你确定吗?我不认为你的xpath会选择任何东西。 (你没有考虑命名空间。) –

1

这是因为built-in template rules当处理器在您的XSLT中找不到匹配的模板时使用这些模板

处理XML的使用XSLT寻找一个文档节点(由/表示)相匹配的模板开始,因为你没有在你的XSLT模板匹配内置的模板适用

<xsl:template match="*|/"> 
    <xsl:apply-templates/> 
</xsl:template> 

这将简单地通过节点,并查找匹配子节点的模板。

当它到达CstmrCdtTrfInitn时,您还没有匹配的模板,所以内置模板仍然适用于选择其子级。你确实有一个匹配pmtInf但不是GrpHdr的模板。对于GrpHdr元素,最终的内置模板将达到文本节点,它获取这些

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

换句话说匹配,则内置模板输出它发现的任何文本节点,这就是为什么你得到的额外的文本。

你可以做什么,是加入一个匹配GrpHdr并告诉XSLT模板,再往前走了

<xsl:template match="doc:GrpHdr" /> 

或者你可以有一个匹配doc:CstmrCdtTrfInitn一个模板,然后选择只有你想要的子节点。

<xsl:template match="doc:CstmrCdtTrfInitn"> 
    <xsl:apply-templates select="doc:PmtInf" /> 
</xsl:template> 

如果你不想在所有依靠内置模板,或者如果你有你的XML其它元素正在进入游戏,你不想让他们,你也可以尝试加入这个模板,以匹配文档节点,然后跳转到PmtInf节点。

<xsl:template match="/"> 
    <xsl:apply-templates select="doc:Document/doc:CstmrCdtTrfInitn/doc:PmtInf" /> 
</xsl:template> 

举个例子,这应该给你结果你需要

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="blablabla" version="1.0"> 
    <xsl:output method="text" encoding="utf-8" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="doc:GrpHdr" /> 

    <xsl:template match="doc:PmtInf"> 
     1. <xsl:value-of select="doc:Dbtr/doc:Nm" /> 
     2. <xsl:value-of select="doc:Dbtr/doc:PstlAdr/doc:StrtNm" /> 
     3. <xsl:value-of select="doc:Dbtr/doc:PstlAdr/doc:PstCd" /> 
     4. <xsl:value-of select="doc:Dbtr/doc:PstlAdr/doc:TwnNm" /> 
    </xsl:template> 
</xsl:stylesheet>