如何用字符串替换缩写?

Posted

技术标签:

【中文标题】如何用字符串替换缩写?【英文标题】:How can I replace an abbreviation with a string? 【发布时间】:2022-01-07 16:57:15 【问题描述】:

我正在创建一个 XSL 文件,该文件将从 XML 文件中提取有关在我所在地区被拖走的汽车的信息,并按汽车被拖走的日期升序对其进行排序。我需要在转换后的文件中显示拖车日期、车牌和汽车颜色。我的问题是每辆车的颜色都有缩写,我想要颜色的全名而不是三个字母的缩写。

这是我的 XML 文件:

<?xml version="1.0"?>
<response>
    <tow>
        <tow_date>2021-10-10</tow_date>
        <make>CHRI</make>
        <style>4D</style>
        <color>WHI</color>
        <plate>549XIB</plate>
        <state>AZ</state>
        <towed_to_address>10300 S. Doty</towed_to_address>
        <tow_facility_phone>(773) 568-8495</tow_facility_phone>
        <inventory_number>2922125</inventory_number>
    </tow>
    <tow>
        <tow_date>2021-10-24</tow_date>
        <make>TOYT</make>
        <style>4T</style>
        <color>GRY</color>
        <plate>LDNE06</plate>
        <state>FL</state>
        <towed_to_address>701 N. Sacramento</towed_to_address>
        <tow_facility_phone>(773) 265-7605</tow_facility_phone>
        <inventory_number>7015429</inventory_number>
    </tow>
    <tow>
        <tow_date>2021-11-06</tow_date>
        <make>JEEP</make>
        <style>LL</style>
        <color>BLK</color>
        <plate>HDU4518</plate>
        <state>NY</state>
        <towed_to_address>701 N. Sacramento</towed_to_address>
        <tow_facility_phone>(773) 265-7605</tow_facility_phone>
        <inventory_number>7016130</inventory_number>
    </tow>
</response>

这是我的 XSL 文件:

<?xml version="1.0" encoding="UTF-8" ?>

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

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

    <xsl:template match="/">
        <xsl:element name="summary">
            <state name="Arizona">
                <xsl:apply-templates select="response/tow[state = 'AZ']">
                    <xsl:sort select="tow_date" order="ascending" />
                </xsl:apply-templates>
            </state>
            <state name="Florida">
                <xsl:apply-templates select="response/tow[state = 'FL']">
                    <xsl:sort select="tow_date" order="ascending" />
                </xsl:apply-templates>
            </state>
            <state name="New York">
                <xsl:apply-templates select="response/tow[state = 'NY']">
                    <xsl:sort select="tow_date" order="ascending" />
                </xsl:apply-templates>
            </state>
        </xsl:element>
    </xsl:template>

    <xsl:template match="tow" >
        <vehicle date="tow_date" plate="plate" color="color" />
    </xsl:template>

</xsl:stylesheet>

我转换后的文档是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<summary>
    <state name="Arizona">
        <vehicle date="2021-10-10" plate="549XIB" color="WHI"/>
    </state>
    <state name="Florida">
        <vehicle date="2021-10-24" plate="LDNE06" color="GRY"/>
    </state>
    <state name="New York">
        <vehicle date="2021-11-06" plate="HDU4518" color="BLK"/>
    </state>
</summary>

在我转换的文件中,我希望 WHI、GRY 和 BLK 的值变为 WHITE、GRAY 和 BLACK。我该怎么做?

【问题讨论】:

这是作业吗? ***.com/q/70163901/3016153 【参考方案1】:

请尝试以下 XSLT。

颜色选择基于&lt;xsl:choose&gt; 分支元素的使用。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <xsl:element name="summary">
            <state name="Arizona">
                <xsl:apply-templates select="response/tow[state = 'AZ']">
                    <xsl:sort select="tow_date" order="ascending"/>
                </xsl:apply-templates>
            </state>
            <state name="Florida">
                <xsl:apply-templates select="response/tow[state = 'FL']">
                    <xsl:sort select="tow_date" order="ascending"/>
                </xsl:apply-templates>
            </state>
            <state name="New York">
                <xsl:apply-templates select="response/tow[state = 'NY']">
                    <xsl:sort select="tow_date" order="ascending"/>
                </xsl:apply-templates>
            </state>
        </xsl:element>
    </xsl:template>

    <xsl:template match="tow">
        <vehicle date="tow_date" plate="plate">
            <xsl:attribute name="color">
                <xsl:choose>
                    <xsl:when test="color='WHI'">WHITE</xsl:when>
                    <xsl:when test="color='GRY'">GRAY</xsl:when>
                    <xsl:when test="color='BLK'">BLACK</xsl:when>
                    <xsl:otherwise>... some default color ....</xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
        </vehicle>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

【参考方案2】:

比 Yitzhak 的更优雅/可维护的解决方案,如果有几十个颜色代码,性能会更好,就是将颜色词汇表放在单独的文档中 colors.xml

<colors>
  <color code="WHI">WHITE</color>
  ...
</colors>

定义一个索引:

<xsl:key name="color-codes" match="color" use="@code"/>

然后(在 XSLT 2.0+ 中)

<xsl:template match="tow">
   <vehicle date="tow_date" plate="plate" 
            color="key('color-codes', color, doc('colors.xml'))"/>
</xsl:template>

或在 XSLT 1.0 中

<xsl:template match="tow">
   <xsl:variable name="short-color" select="color"/>
   <xsl:variable name="full-color">
     <xsl:for-each select="document('colors.xml')">
       <xsl:value-of select="key('color-codes', $short-color)"/>
     </xsl:for-each>
   </xsl:variable>
   <vehicle date="tow_date" plate="plate" 
            color="$full-color)"/>
</xsl:template>

【讨论】:

以上是关于如何用字符串替换缩写?的主要内容,如果未能解决你的问题,请参考以下文章

如何用Python来进行查询和替换一个文本字符串

Android - 如何用另一个字符串替换部分字符串?

字符串操作:如何用特定模式替换字符串

如何用正则表达式替换字符串

如何用sed命令替换一行中的某个字符串

如何用 HTML DOM 替换字符串