XSLT 映射仅在开始和结束位置删除双引号
XSLT mapping to remove double quotes only at starting and ending positions
专家,我需要编写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(., '\"', '')"/>
</xsl:template>
</xsl:stylesheet>
此 XSLT 删除了我输入字段中的所有双引号,请在此处提供帮助..
<xsl:template match="text()">
<xsl:value-of
select="concat(
translate(substring(., 1, 1), '"', ''),
substring(., 2, string-length() - 2),
translate(substring(., string-length()), '"', '')
)"/>
</xsl:template>
另一种看待它的方式:
<xsl:template match="text()">
<xsl:variable name="len" select="string-length()" />
<xsl:variable name="s" select="starts-with(., '"')" />
<xsl:variable name="e" select="substring(., $len) = '"'" />
<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
开始标签中。
专家,我需要编写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(., '\"', '')"/>
</xsl:template>
</xsl:stylesheet>
此 XSLT 删除了我输入字段中的所有双引号,请在此处提供帮助..
<xsl:template match="text()">
<xsl:value-of
select="concat(
translate(substring(., 1, 1), '"', ''),
substring(., 2, string-length() - 2),
translate(substring(., string-length()), '"', '')
)"/>
</xsl:template>
另一种看待它的方式:
<xsl:template match="text()">
<xsl:variable name="len" select="string-length()" />
<xsl:variable name="s" select="starts-with(., '"')" />
<xsl:variable name="e" select="substring(., $len) = '"'" />
<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
开始标签中。