在XSLT 1.0中,在XML元素和名称空间之间剥离编码值
本文关键字:空间 之间 编码值 剥离 元素 XSLT XML | 更新日期: 2023-09-27 18:02:49
我有一个XML, XML元素之间有空格。我正在用XSLT 1.0模板将其转换为XSL FO以打印pdf报告。我想解码XSLT中的值,以便在PDF中打印。下面是我的XML和XSLT 1.0。有人能指导我解码XML元素之间的值吗?
XML> <PdfPrinter>
<Reports>
<Report>
<BranchID>SA-02</BranchID>
<Trade_x0020_Date>2016-08-10T00:00:00</Trade_x0020_Date>
<Account_x0020_No>ABCDE01384</Account_x0020_No>
<CParty_x0020_ID/>
<Reference_x0020_No>TS-N-203-001</Reference_x0020_No>
<Source>N</Source>
<CDS_x0020_No>0000001387</CDS_x0020_No>
<Dealer_x0020_ID>1D01</Dealer_x0020_ID>
<Stock_x0020_ID>0400GA</Stock_x0020_ID>
<Price>0.123000</Price>
<Quantity>-1200</Quantity>
<Currency xmlns="Traded">USD</Currency>
<Nett_x0020_Amount xmlns="Traded">-86.600000</Nett_x0020_Amount>
<Currency xmlns="Local">USD</Currency>
<Nett_x0020_Amount xmlns="Local">-86.600000</Nett_x0020_Amount>
<Promo_x0020_Ind>N</Promo_x0020_Ind>
<Charge_x0020_ID xmlns="Brokerage">BRK-N</Charge_x0020_ID>
<Amount xmlns="Brokerage">50.000000</Amount>
<Charge_x0020_ID>CLR</Charge_x0020_ID>
<Amount xmlns="ClearingFee">10.000000</Amount>
<Charge_x0020_ID xmlns="ClearingFee">SDC</Charge_x0020_ID>
<Amount xmlns="StampDuty">1.000000</Amount>
<Charge_x0020_ID xmlns="StampDuty"/>
<Charge_x0020_ID xmlns="Penalty">0</Charge_x0020_ID>
<Amount xmlns="Penalty">0.000000</Amount>
<Tax_x0020_Amount>0.000000</Tax_x0020_Amount>
</Report>
</Reports>
</PdfPrinter>
XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ext="http://exslt.org/common"
xmlns:utilityExtension="pdfprinter:extensions:utility"
exclude-result-prefixes="msxsl utilityExtension">
<xsl:output method="xml" indent="yes"
omit-xml-declaration="yes" encoding="utf-8"/>
<xsl:template match="/">
<xsl:variable name="Brokerage">Brokerage</xsl:variable>
<xsl:variable name="ClearingFee">Clearing Fee</xsl:variable>
<xsl:variable name="StampDuty">Stamp Duty</xsl:variable>
<xsl:variable name="Penalty">Penalty</xsl:variable>
<xsl:variable name="OtherCharges">Other Charges</xsl:variable>
<xsl:variable name="columnFontSize">12pt</xsl:variable>
<xsl:variable name="columnFontType">Helvetica</xsl:variable>
<xsl:variable name="headerOrgName">Pn</xsl:variable>
<xsl:variable name="headerPrintedBy">Printed By</xsl:variable>
<xsl:variable name="headerPrintedDate">Printed Date</xsl:variable>
<xsl:variable name="headerReportID">Report ID</xsl:variable>
<xsl:variable name="headerLogo" select
="utilityExtension:MapPath('~/App_Data/Resources/IMAGES/logo.jpg')"/>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!-- defines the layout master -->
<fo:layout-master-set>
<fo:simple-page-master master-name="all-pages" page-width="894mm" page-height="1300pt" margin-top="10mm" margin-left="20mm" margin-right="20mm" margin-bottom="10mm">
<fo:region-body region-name="xsl-region-body" column-gap="0in" margin="0.8in" margin-left="0.7in" margin-top="2.3in" margin-bottom="1.8in" padding-top="0in"/>
<fo:region-before region-name="xsl-region-before" extent="75mm" />
<fo:region-after region-name="xsl-region-after" extent="7in"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="default-sequence">
<fo:single-page-master-reference master-reference="all-pages"/>
<fo:repeatable-page-master-reference master-reference="all-pages" />
</fo:page-sequence-master>
</fo:layout-master-set>
<!-- starts actual layout -->
<fo:page-sequence master-reference="default-sequence" initial-page-number="1" id="last-page">
<fo:static-content flow-name="xsl-region-before" width="100%" border-top-style="solid" border-top-color="rgb(192,192,192)" padding-top="1pt">
<fo:block>
<fo:table border-collapse="collapse" width="100%" table-layout="fixed" margin-top="-0.002in" padding-left="0.7in" margin-left="0in" border-spacing="5px" space-before.conditionality="retain" space-after.conditionality="retain" space-after="1em" space-before="1em">
<fo:table-column column-width="proportional-column-width(55)" column-number="1"/>
<fo:table-column column-width="proportional-column-width(45)" column-number="2"/>
<fo:table-column column-width="proportional-column-width(45)" column-number="3"/>
<fo:table-column column-width="proportional-column-width(45)" column-number="4"/>
<fo:table-column column-width="proportional-column-width(45)" column-number="5"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell width="50%" text-align="left" padding-left="2pt">
<fo:block color="rgb(0,0,128)" font-size="16pt" font-weight="bold"> </fo:block>
<fo:block color="rgb(0,0,128)" font-weight="bold"></fo:block>
<fo:block padding-left="0in">
<fo:external-graphic src="{$headerLogo}"/>    
<fo:block>
</fo:block>
</fo:block>
<fo:block color="rgb(0,0,128)" font-weight="bold">    </fo:block>
<fo:block color="rgb(0,0,0)" font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
<xsl:value-of select="$headerReportID"/> : <xsl:value-of select="/PdfPrinter/Reports/Header/ReportID" />
</fo:block>
</fo:table-cell>
<fo:table-cell></fo:table-cell>
<fo:table-cell></fo:table-cell>
<fo:table-cell></fo:table-cell>
<fo:table-cell width="100%" text-align="left">
<fo:block>    </fo:block>
<fo:block>    </fo:block>
<fo:block>    </fo:block>
<fo:block>    </fo:block>
<fo:block>    </fo:block>
<fo:block text-align="left">
<fo:inline font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
Page <fo:page-number/> of <fo:page-number-citation ref-id="last-page"/>
</fo:inline>
</fo:block>
<fo:block text-align="left">
<fo:inline font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
<xsl:value-of select="$headerPrintedBy"/> : <xsl:value-of select="/PdfPrinter/Reports/Report/BrkChgID[(count(current()/preceding-sibling::*)+1)]/@id"/>
</fo:inline>
</fo:block>
<fo:block text-align="left">
<fo:inline font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
<xsl:value-of select="$headerPrintedDate"/> : <xsl:value-of select="/PdfPrinter/Reports/Header/PrintedDate" />
</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:block/>
</fo:block>
<fo:block text-align="center">
<fo:table padding-left="0.7in" border-bottom-width="5pt" border-width="1pt" font-weight="bold" inline-progression-dimension="auto" width="100%">
<fo:table-column column-number="1"/>
<fo:table-body>
<fo:table-row border-bottom-color="rgb(0,0,255)" display-align="before">
<fo:table-cell border-bottom-width="3pt" border-bottom-style="solid" border-bottom-color="rgb(255,255,255)" padding="2pt" text-align="left">
<fo:block text-align="center" font-size="13pt" font-weight="bold" font-family="Helvetica" border-bottom="10pt "></fo:block>
<fo:block>
<xsl:value-of select="/PdfPrinter/Reports/Header/ReportTitle" />
</fo:block>
<fo:block border-bottom-width="8pt" text-align="center" background-color="black"/>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block text-align="center">
<!-- table start -->
<fo:table role="html:table" table-layout="auto" inline-progression-dimension="auto" line-height="2.5" width="100%" border="0px" border-collapse="collapse" border-spacing="3px" border-style="outset hidden" space-before.conditionality="retain" space-after.conditionality="retain" space-after="1em" space-before="1em">
<!--table header-->
<xsl:for-each select="/PdfPrinter/Reports/Report[1]/*">
<fo:table-column column-width="proportional-column-width(4.77)" font-family="sans-serif" font-size="13pt" />
</xsl:for-each>
<fo:table-header>
<fo:table-row height="auto" color="#FFFFFF" background-color="#A1A1A1" text-align="center" font-weight="bold" font-family="sans-serif" font-size="13pt">
<fo:table-cell text-align="center" column-number="16" number-columns-spanned="3" border-after-width="1pt" border-after-style="solid">
<fo:block font-size="13pt" font-family="sans-serif">
<xsl:value-of select="$Brokerage"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" column-number="19" number-columns-spanned="2">
<fo:block font-size="13pt" font-family="sans-serif">
<xsl:value-of select="$ClearingFee"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" column-number="21" number-columns-spanned="2">
<fo:block font-size="13pt" font-family="sans-serif">
<xsl:value-of select="$StampDuty"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" column-number="23" number-columns-spanned="2">
<fo:block font-size="13pt" font-family="sans-serif">
<xsl:value-of select="$Penalty"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" column-number="25" number-columns-spanned="1">
<fo:block font-size="13pt" font-family="sans-serif">
<xsl:value-of select="$OtherCharges"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row height="auto" color="#FFFFFF" background-color="#A1A1A1" text-align="center" font-weight="bold" font-family="sans-serif" font-size="14pt">
<xsl:for-each select="/PdfPrinter/Reports/Report[1]/*">
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">
<xsl:value-of select="name()"/>
</fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
</fo:table-header>
<!--table body-->
<fo:table-body>
<xsl:for-each select="PdfPrinter/Reports/Report">
<fo:table-row display-align="before">
<xsl:for-each select="*">
<fo:table-cell text-align="center" border-top-color="rgb(255, 255, 255)" border-top-style="solid" border-width="1pt" padding="2pt">
<fo:block font-size="13pt" font-family="sans-serif">
<xsl:value-of select="."/>
</fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
<!-- table end -->
</fo:block>
<fo:block id="last-page"/>
</fo:flow>
</fo:page-sequence>
</fo:root>
元素Charge_x0020_ID实际上是电荷ID,但目前我的XSLT正在打印编码值。我想通过解码特殊字符将该列打印为收费ID。如有任何帮助,不胜感激。
试试这个模板调用:
<!--xsl:value-of select="name()"/-->
<xsl:call-template name="replaceDecodedSpace">
<xsl:with-param name="prmStr" select="local-name()"/>
</xsl:call-template>
...
<xsl:template name="replaceDecodedSpace">
<xsl:param name="prmStr" select="''"/>
<xsl:variable name="encodedSpace" select="'_x0020_'"/>
<xsl:choose>
<xsl:when test="contains($prmStr,$encodedSpace)">
<xsl:variable name="beforeSpacePart" select="substring-before($prmStr,$encodedSpace)"/>
<xsl:variable name="afterSpacePart" select="substring-after($prmStr,$encodedSpace)"/>
<xsl:value-of select="concat($beforeSpacePart,' ')"/>
<xsl:call-template name="replaceDecodedSpace">
<xsl:with-param name="prmStr" select="$afterSpacePart"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$prmStr"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
结果: <fo:table-row height="auto"
color="#FFFFFF"
background-color="#A1A1A1"
text-align="center"
font-weight="bold"
font-family="sans-serif"
font-size="14pt">
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">BranchID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Trade Date</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Account No</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">CParty ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Reference No</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Source</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">CDS No</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Dealer ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Stock ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Price</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Quantity</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Currency</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Nett Amount</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Currency</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Nett Amount</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Promo Ind</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Charge ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Amount</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Charge ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Amount</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Charge ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Amount</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Charge ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Charge ID</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Amount</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center">
<fo:block font-size="13pt" font-family="sans-serif">Tax Amount</fo:block>
</fo:table-cell>
</fo:table-row>