使用xslt转义双引号

时间:2018-02-22 12:18:56

标签: xml xslt-1.0

如何使用XSLT转义双引号:

我的xls文件将xml文件转换为csv文件。

我的xml节点如下:

    <?xml version="1.0" encoding="ISO-8859-1"?>
<TRADING_TITLE><TITLE>SBU</TITLE><DESCRIPTION><![CDATA[Simply Be Inquiries]]></DESCRIPTION><REGISTERED><NAME><![CDATA[Speciality Home Shopping (US) Limited]]></NAME><ADDRESS1><![CDATA[Griffin House]]></ADDRESS1><ADDRESS2><![CDATA[40 Lever Street]]></ADDRESS2><ADDRESS3><![CDATA[Manchester]]></ADDRESS3><ADDRESS4><![CDATA[United Kingdom]]></ADDRESS4><ADDRESS5><![CDATA[M60  6ES]]></ADDRESS5></REGISTERED><WEB_ADDRESS>www.simplybe.com</WEB_ADDRESS><COMPANY_NUMBER>03941468</COMPANY_NUMBER><ENQUIRY_DAYS_PER_WEEK>7</ENQUIRY_DAYS_PER_WEEK><ENQUIRY_TEL_NO>18774074675</ENQUIRY_TEL_NO><ORDER_TEL_NO>18774074675</ORDER_TEL_NO><ORDERLINETIMES><WEEKDAY_OPEN>8am</WEEKDAY_OPEN><WEEKDAY_CLOSE>11pm</WEEKDAY_CLOSE><SATURDAY_OPEN>8am</SATURDAY_OPEN><SATURDAY_CLOSE>11pm</SATURDAY_CLOSE><SUNDAY_OPEN>8am</SUNDAY_OPEN><SUNDAY_CLOSE>11pm</SUNDAY_CLOSE></ORDERLINETIMES><ENQUIRYLINETIMES><WEEKDAY_OPEN>8am</WEEKDAY_OPEN><WEEKDAY_CLOSE>11pm</WEEKDAY_CLOSE><SATURDAY_OPEN>8am</SATURDAY_OPEN><SATURDAY_CLOSE>11pm</SATURDAY_CLOSE><SUNDAY_OPEN>8am</SUNDAY_OPEN><SUNDAY_CLOSE>11pm</SUNDAY_CLOSE></ENQUIRYLINETIMES><CORRESPONDENCE><NAME><![CDATA[Simply Be Inquiries]]></NAME><ADDRESS1><![CDATA[777 South State Road 7]]></ADDRESS1><ADDRESS2><![CDATA[Margate, Florida 33068]]></ADDRESS2><ADDRESS3/><ADDRESS4/><ADDRESS5/></CORRESPONDENCE><TRADING_AS_INDICATOR>Y</TRADING_AS_INDICATOR><REGISTERED_NUMBER>03941468</REGISTERED_NUMBER><BRAND_LOGO_NUMBER>DAL90</BRAND_LOGO_NUMBER><FSA_TEXT><![CDATA["Simply Be" is a trading name of Speciality Home Shopping (US) Limited, registered in England with Co No. 03941468 and registered office at Griffin House, 40 Lever Street, Manchester UK M60 6ES]]></FSA_TEXT></TRADING_TITLE>

我想在整个XML文件中替换“with”。请帮助。

我的xls文件如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" version="1.0" encoding="UTF-8" />
    <xsl:template match="/">

        <!--  Now process each notification detail -->
        <xsl:for-each select="descendant::TRADING_TITLE">

            <xsl:text>,</xsl:text>
            <xsl:text>A,</xsl:text>
            <xsl:text>,</xsl:text>
            <xsl:text>,</xsl:text>
            <xsl:choose>
                <xsl:when test="TITLE != ''">
                    <xsl:text>"</xsl:text>
                    <xsl:value-of select="TITLE"></xsl:value-of>
                    <xsl:text>"</xsl:text>
                    &comma;
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="TITLE"></xsl:value-of>
                    &comma;
                </xsl:otherwise>
            </xsl:choose>       

            <xsl:text>"</xsl:text>
            <xsl:value-of select="DESCRIPTION"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="REGISTERED/NAME"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>  
            <xsl:value-of select="REGISTERED/ADDRESS1"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="REGISTERED/ADDRESS2"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma; 
            <xsl:text>"</xsl:text>
            <xsl:value-of select="REGISTERED/ADDRESS3"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="REGISTERED/ADDRESS4"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="REGISTERED/ADDRESS5"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="WEB_ADDRESS"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="COMPANY_NUMBER"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRY_DAYS_PER_WEEK"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRY_TEL_NO"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ORDER_TEL_NO"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ORDERLINETIMES/WEEKDAY_OPEN"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ORDERLINETIMES/WEEKDAY_CLOSE"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ORDERLINETIMES/SATURDAY_OPEN"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ORDERLINETIMES/SATURDAY_CLOSE"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ORDERLINETIMES/SUNDAY_OPEN"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ORDERLINETIMES/SUNDAY_CLOSE"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRYLINETIMES/WEEKDAY_OPEN"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRYLINETIMES/WEEKDAY_CLOSE"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRYLINETIMES/SATURDAY_OPEN"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRYLINETIMES/SATURDAY_CLOSE"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRYLINETIMES/SUNDAY_OPEN"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="ENQUIRYLINETIMES/SUNDAY_CLOSE"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="CORRESPONDENCE/NAME"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="CORRESPONDENCE/ADDRESS1"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="CORRESPONDENCE/ADDRESS2"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="CORRESPONDENCE/ADDRESS3"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="CORRESPONDENCE/ADDRESS4"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="CORRESPONDENCE/ADDRESS5"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="TRADING_AS_INDICATOR"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="REGISTERED_NUMBER"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:value-of select="BRAND_LOGO_NUMBER"></xsl:value-of>
            <xsl:text>"</xsl:text>
            &comma;
            <xsl:text>"</xsl:text>
            <xsl:text>"</xsl:text>
            <xsl:value-of select="FSA_TEXT"></xsl:value-of>
            <xsl:text>"</xsl:text>
            <xsl:text>"</xsl:text>
        </xsl:for-each> 
    </xsl:template>

</xsl:stylesheet>

csv文件的输出如下:

JDW,A ,,,“SBU”,“Simply Be Consult”,“Special Home Shopping(US)Limited”,“Griffin House”,“40 Lever Street”,“Manchester”,“United Kingdom”,“ M60 6ES“,”www.simplybe.com“,”03941468“,”7“,”18774074675“,”18774074675“,”8am“,”晚上11点“,”早上8点“,”晚上11点“,”早上8点“,”晚上11点“ “,”早上8点“,”晚上11点“,”早上8点“,”晚上11点“,”早上8点“,”晚上11点“,”只需查询“,”777 South State Road 7“,”Margate,Florida 33068“,”“, “”,“”,“Y”,“03941468”,“DAL90”,“”Simply Be“是Specialty Home Shopping(US)Limited的交易名称,在英格兰注册,编号为03941468并已注册位于英国曼彻斯特Lever街40号Griffin House的办公室M60 6ES“”

但所需的输出为

JDW,A ,,,“SBU”,“Simply Be Consult”,“Special Home Shopping(US)Limited”,“Griffin House”,“40 Lever Street”,“Manchester”,“United Kingdom”,“ M60 6ES“,”www.simplybe.com“,”03941468“,”7“,”18774074675“,”18774074675“,”8am“,”晚上11点“,”早上8点“,”晚上11点“,”早上8点“,”晚上11点“ “,”早上8点“,”晚上11点“,”早上8点“,”晚上11点“,”早上8点“,”晚上11点“,”只需查询“,”777 South State Road 7“,”Margate,Florida 33068“,”“, “”,“”,“Y”,“03941468”,“DAL90”,“”Simply Be“”是Specialty Home Shopping(US)Limited的商品名,在英国注册,编号为03941468,英国曼彻斯特Lever街40号格里芬大厦的注册办公室M60 6ES“

1 个答案:

答案 0 :(得分:1)

从根本上说,你有一个文本,你想要替换双引号的所有实例&#34;用两个双引号而不是一个&#34;&#34;

不幸的是,XSLT 1.0使得将字符串的实例替换为另一个字符串变得非常困难。

您可以使用以字符串作为参数的递归命名模板来执行此操作,并将每个&#34;输出此字符串。加倍为&#34;&#34;。递归原则是,

  • 字符串中不包含&#34;它按原样输出
  • 或它确实包含&#34;,因此您可以在第一个&#34;之前输出所有内容。按原样,然后输出&#34;&#34;,然后在第一个&#34;之后的字符串上重复该过程。

示例:

应用此

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="doublequotes">
    <xsl:param name="text" select="."/>
    <xsl:variable name="quot">"</xsl:variable>
    <xsl:choose>
        <xsl:when test="contains($text, $quot)">
            <xsl:value-of select="substring-before($text, $quot)"/>
            <xsl:text>""</xsl:text>
            <xsl:call-template name="doublequotes">
                <xsl:with-param name="text" select="substring-after($text, $quot)"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="input">
    <result>
        <xsl:call-template name="doublequotes"/>
    </result>
</xsl:template>

</xsl:stylesheet>

到此:

<input>I want to shout "Hello world" out there!</input>

编辑:因此,将其应用于您的情况

保留命名模板,并替换

<xsl:value-of select="FSA_TEXT">

<xsl:call-template name="doublequotes">
  <xsl:with-param name="text" select="FSA_TEXT"/>
</xsl:call-template>