【问题标题】:XSLT mapping to remove double quotes only at starting and ending positionsXSLT 映射仅在开始和结束位置删除双引号
【发布时间】:2021-08-28 02:37:10
【问题描述】:

专家,我需要编写 XSLT 1.0 代码来消除字段开始和结束处的双引号(简而言之,仅起始和结束位置双引号),不应该删除输入字段中的任何其他双引号。

输入:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03">
    <CstmrPmtStsRpt>
        <GrpHdr>
            <MsgId>"88245"322"2608""</MsgId>
            <CreDtTm>"22219"</CreDtTm>
             <OrgnlNbOfTxs>12"3"41</OrgnlNbOfTxs>
        </GrpHdr>
       
    </CstmrPmtStsRpt>
</Document>

** 所需输出:**

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03">
    <CstmrPmtStsRpt>
        <GrpHdr>
            <MsgId>88245"322"2608"</MsgId>
            <CreDtTm>22219</CreDtTm>
             <OrgnlNbOfTxs>12"3"41</OrgnlNbOfTxs>
        </GrpHdr>
       
    </CstmrPmtStsRpt>
</Document>

** 我使用的 XSLT 如下:**

<?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" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*/text()">
        <xsl:value-of select="translate(., '\&quot;', '')"/>
    </xsl:template>

</xsl:stylesheet>

此 XSLT 从我的输入字段中删除所有双引号,请在此处提供帮助..

【问题讨论】:

  • 好吧,w3.org/TR/1999/REC-xpath-19991116/#function-starts-with 存在用于检查,同样您可以检查 substring(., string-length(.)) = '"' 是否结束,然后使用 substring 删除第一个和/或最后一个字符(如果它们是引号)。或者检查您的 XSLT 1 处理器是否有任何类似于 XPath 2 replace(., '^"|"$', '') 的正则表达式支持。
  • w3.org/1999/XSL/Transform">
  • 我尝试了上面的代码,但给出了一些错误。

标签: xslt xslt-1.0 xslt-grouping


【解决方案1】:

你可以用另一种方式看待它:

<xsl:template match="text()">
    <xsl:variable name="len" select="string-length()" />
    <xsl:variable name="s" select="starts-with(., '&quot;')" />
    <xsl:variable name="e" select="substring(., $len) = '&quot;'" />
    <xsl:value-of select="substring(., 1 + $s, $len - $s - $e)" />
</xsl:template> 

当然,如果您知道某些元素将总是有前导和尾随引号,您可以这样做:

<xsl:template match="ns0:MsgId | ns0:CreDtTm">
    <xsl:copy>
        <xsl:value-of select="substring(., 2, string-length() - 2)" />
    </xsl:copy>
</xsl:template> 

只要你包括:

xmlns:ns0="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03"
exclude-result-prefixes="ns0"

xsl:stylesheet 开始标签中。

【讨论】:

    【解决方案2】:
    <xsl:template match="text()">
        <xsl:value-of 
           select="concat(
                     translate(substring(., 1, 1), '&quot;', ''), 
                     substring(., 2, string-length() - 2), 
                     translate(substring(., string-length()), '&quot;', '')
                   )"/>
    </xsl:template>
    

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2011-03-19
      • 2018-11-01
      • 2021-12-09
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多