我对XSLT的工作原理有了基本的了解,并且确信我需要以某种方式使用Replace函数。但是我怎么也想不明白。
我正在将一个丑陋的Quickbooks xml报告从api转换成一个我可以管理的CSV,它确实是我想要的,除了有一个额外的"其中一个block将所有内容从导出行中删除我不确定如何在XSLT文件
中检查这一点下面是xslt文件:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:variable name="delimiter" select="','"/>
<xsl:variable name="Quotes" select="'"'"/>
<xsl:template match="/">
<xsl:for-each select="QBXML/QBXMLMsgsRs/GeneralDetailReportQueryRs/ReportRet/ReportData/DataRow">
<xsl:value-of select="$Quotes"/>
<xsl:value-of select="./RowData/@value[../@rowType]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=2]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=3]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=4]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=5]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=6]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=7]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=8]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=9]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=10]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=11]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=12]"/>
<xsl:value-of select="$Quotes"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
问题中的具体行是这样的:
<DataRow rowNumber="1409">
<RowData rowType="item" value="Triaxle Stone 2A Modified 3/4"" />
<ColData colID="2" value="Sales Order" />
<ColData colID="3" value="2020-04-24" />
<ColData colID="4" value="2020-04-24" />
<ColData colID="5" value="5810" />
<ColData colID="6" value="SCHMIDT, JOHN" />
<ColData colID="7" value="22" />
<ColData colID="8" value="21.65" />
<ColData colID="9" value="0.35" />
<ColData colID="10" value="ton" />
<ColData colID="11" value="354.86" />
<ColData colID="12" value="5.65" />
</DataRow>
我在Linux上使用XSLT-1.0处理器xsltproc
测试了XML/XSLT组合。它运行得完美无缺。XML中唯一的"
("
)表示项目(3/4"
)的度量。
但是如果你真的需要删除这个"
字符,你可以用fn:translate()
函数从输出中删除它:
<xsl:value-of select="translate(./RowData/@value[../@rowType],'"','')"/>
或者,在某些上下文中
...
<xsl:template match="/">
<xsl:for-each select="DataRow">
<xsl:value-of select="$Quotes"/>
<xsl:value-of select="translate(./RowData/@value[../@rowType],'"','')"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
<xsl:value-of select="./ColData/@value[../@colID=2]"/>
<xsl:value-of select="concat($Quotes,$delimiter,$Quotes)"/>
...