2017-07-14 135 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>