我有一个xml以下,
<?xml version="1.0" encoding="utf-8"?>
<NewDataSet xmlns="www.reefpt.com/caliberapi">
<ARTransactions>
<PostingDate>2010-01-01T00:00:00-07:00</PostingDate>
<Description>Quarterley Assessment</Description>
<Amount>47</Amount>
</ARTransactions>
<ARTransactions>
<PostingDate>2010-01-03T00:00:00-07:00</PostingDate>
<Description>Payment, Thank You.</Description>
<Amount>-43</Amount>
</ARTransactions>
<ARTransactions>
<PostingDate>2010-04-15T00:00:00-07:00</PostingDate>
<Description>Quarterley Assessment</Description>
<Amount>23</Amount>
</ARTransactions>
</NewDataSet>
我想把它变成,
<trxs>
<trx trx_credit="47" trx_debit="0.00" />
<trx trx_credit="0.00" trx_debit="43" />
<trx trx_credit="23" trx_debit="0.00" />
<trxs>
对于每个ARTransactions元素,如果它具有正数量,那么它应该在trx_credit中,否则它应该是int trx_debit。因此,每个生成的trx元素将包含信用卡或借记卡,另一个将为0.00。我怎么能为此编写XSLT?有人能帮助我吗?
答案 0 :(得分:2)
这是Treemonkey解决方案中的20行第二个模板的简单版本(需要XSLT 2.0)
<xsl:template match="ARTransactions">
<trx trx_credit="{(Amount[. > 0], 0.00)[1]}"
trx_debit="{(abs(Amount[. > 0], 0.00)[1])}"/>
</xsl:template>
XSLT经常被批评为冗长,但并非必须如此。
答案 1 :(得分:0)
您可以使用xsl属性元素来有条件地添加属性。 下面的代码段将为每个ARTransactions创建一个trx元素。
<xsl:for-each select="//ARTransactions">
<trx>
<xsl:choose>
<xsl:when test="Amount >= 0">
<xsl:attribute name="trx_credit" select="Amount" />
<xsl:attribute name="trx_debit" select="0" />
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="trx_debit" select="-1 * Amount" />
<xsl:attribute name="trx_credit" select="0" />
</xsl:otherwise>
</xsl:choose>
</trx>
</xsl:for-each>
答案 2 :(得分:0)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="NewDataSet">
<trxs>
<xsl:apply-templates select="ARTransactions"/>
</trxs>
</xsl:template>
<xsl:template match="ARTransactions">
<xsl:element name="trx">
<xsl:attribute name="trx_credit">
<xsl:choose>
<xsl:when test="Amount > 0" >
<xsl:value-of select="Amount"/>
</xsl:when>
<xsl:otherwise>0.00</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="trx_debit">
<xsl:choose>
<xsl:when test="Amount > 0">0.00</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-after(Amount,'-')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:element>
</xsl:template>
</xsl:stylesheet>