2013-12-11 90 views
1

一个子我有这样的XML输入:获取当前节点的XSLT

<?xml version="1.0" encoding="utf-8"?> 
<Document> 
    <TopLevel> 
    <Payments> 
     <PaymentID>PID1</PaymentID> 
     <Transaction> 
     <TransID>TR1-PID1XX</TransID> 
     <TransNumber>1</TransNumber> 
     </Transaction> 
     <Transaction> 
     <TransID>TR1-PID1XY</TransID> 
     <TransNumber>2</TransNumber> 
     </Transaction> 
     <Transaction> 
     <TransID>TR1-PID1XX</TransID> 
     <TransNumber>3</TransNumber> 
     </Transaction> 
    </Payments> 
    <Payments> 
     <PaymentID>PID2</PaymentID> 
     <Transaction> 
     <TransID>TR2-PID2XY</TransID> 
     <TransNumber>4</TransNumber> 
     </Transaction> 
     <Transaction> 
     <TransID>TR2-PID2XX</TransID> 
     <TransNumber>5</TransNumber> 
     </Transaction> 
     <Transaction> 
     <TransID>TR2-PID2XY</TransID> 
     <TransNumber>6</TransNumber> 
     </Transaction> 
    </Payments> 
    </TopLevel> 
</Document> 

这是我的XSLT:

<xsl:template match="Transaction"> 
    <Transaction> 
     <xsl:apply-templates select="TransID"/> 
    </Transaction> 
    </xsl:template> 

    <xsl:template match="TransID"> 
    <TransID> 
     <xsl:value-of select="."/> 
    </TransID> 
    <TransNumber> 
     <xsl:number level="any"/> 
    </TransNumber> 
    <xsl:if test="substring(//TransID,9,2)='XX'"> 
     <TransCode> 
     <xsl:value-of select ="substring(//TransID,1,3)"/> 
     </TransCode> 
    </xsl:if> 
    </xsl:template> 

我的XSLT是不是捡了当前节点的子串,但而是总是得到第一个节点的字符串,我在这里错过了什么?

顺便说这里是我想要的输出:

<Payments> 
    <PaymentID>PID1</PaymentID> 
    <Transaction> 
    <TransID>TR1-PID1XX</TransID> 
    <TransNumber>1</TransNumber> 
    <TransCode>TR11</TransCode> 
    </Transaction> 
    <Transaction> 
    <TransID>TR1-PID1XY</TransID> 
    <TransNumber>2</TransNumber> 
    </Transaction> 
    <Transaction> 
    <TransID>TR1-PID1XX</TransID> 
    <TransNumber>3</TransNumber> 
    <TransCode>TR13</TransCode> 
    </Transaction> 
</Payments> 
<Payments> 
    <PaymentID>PID2</PaymentID> 
    <Transaction> 
    <TransID>TR2-PID2XY</TransID> 
    <TransNumber>4</TransNumber> 
    </Transaction> 
    <Transaction> 
    <TransID>TR2-PID2XX</TransID> 
    <TransNumber>5</TransNumber> 
    <TransCode>TR25</TransCode> 
    </Transaction> 
    <Transaction> 
    <TransID>TR2-PID2XY</TransID> 
    <TransNumber>6</TransNumber> 
    </Transaction> 
</Payments> 

感谢所有为这个美好的社区:)

回答

1

它,因为你一直在寻找整个文档中的所有节点TransID。另外,作为节点集上的substring将针对集合中的第一个节点操作,其始终查看第一个节点。

将其更改为下面,它应该工作正常。

<xsl:if test="substring(./text(),9,2)='XX'"> 
    <TransCode> 
    <xsl:value-of select ="substring(./text(),1,3)"/> 
    </TransCode> 
</xsl:if> 
+0

不错的解决方案,谢谢:) – zyberjock