如何用XSLT 1.0从斜杠分隔的beneaddress2中提取对应字段值?
修改XSLT 1.0样式表实现按分隔符提取字段需求
问题背景
现有XSLT 1.0样式表无法正确拆分输入XML中beneaddress2字段的内容,该字段格式为国家/州/城市/邮编,需要提取对应字段到指定节点:
- BeneficiaryCountry:提取第一个
/之前的内容(如US) - BeneficiaryStateProvince:提取第一个
/与第二个/之间的内容(如CA) - BeneficiaryCity:提取第二个
/与第三个/之间的内容(如SAN FRANCISCO) - BeneficiaryPostalCode:提取第三个
/之后的内容(如012345-657)
原有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="/"> <Retrieval> <xsl:for-each select="root/row"> <Payment> <BeneficiaryCity> <xsl:value-of select="beneaddress2"/> </BeneficiaryCity> <BeneficiaryPostalCode> <xsl:value-of select="beneaddress2"/> </BeneficiaryPostalCode> <BeneficiaryStateProvince> <xsl:value-of select="substring-after(beneaddress2, '/')"/> </BeneficiaryStateProvince> <BeneficiaryCountry> <xsl:value-of select="substring-before(beneaddress2, '/')"/> </BeneficiaryCountry> </Payment> </xsl:for-each> </Retrival> <!-- 注意此处原拼写错误:Retrival 应为 Retrieval --> </xsl:template> </xsl:stylesheet>
输入XML
<?xml version="1.0" encoding="utf-8"?> <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="OuribankMPH.xsd"> <row> <beneaddress2>US/CA/SAN FRANCISCO/012345-657</beneaddress2> </row> </root>
修改后的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="/"> <Retrieval> <xsl:for-each select="root/row"> <Payment> <!-- 提取国家:第一个/之前的内容 --> <BeneficiaryCountry> <xsl:value-of select="substring-before(beneaddress2, '/')"/> </BeneficiaryCountry> <!-- 提取州:第一个/之后,第二个/之前的内容 --> <BeneficiaryStateProvince> <xsl:value-of select="substring-before(substring-after(beneaddress2, '/'), '/')"/> </BeneficiaryStateProvince> <!-- 提取城市:第二个/之后,第三个/之前的内容 --> <BeneficiaryCity> <xsl:value-of select="substring-before(substring-after(substring-after(beneaddress2, '/'), '/'), '/')"/> </BeneficiaryCity> <!-- 提取邮编:第三个/之后的内容 --> <BeneficiaryPostalCode> <xsl:value-of select="substring-after(substring-after(substring-after(beneaddress2, '/'), '/'), '/')"/> </BeneficiaryPostalCode> </Payment> </xsl:for-each> </Retrieval> <!-- 修正原拼写错误:Retrival → Retrieval --> </xsl:template> </xsl:stylesheet>
修改说明
- 修正根节点拼写错误:原样式表中
</Retrival>拼写错误,改为正确的</Retrieval>,避免XML输出格式错误。 - 嵌套使用substring-before和substring-after:
- 州字段:先通过
substring-after获取第一个/后的内容,再用substring-before截取第二个/前的部分。 - 城市字段:嵌套两次
substring-after跳过前两个/,再用substring-before截取第三个/前的部分。 - 邮编字段:嵌套三次
substring-after跳过前三个/,直接获取剩余内容。
- 州字段:先通过
- 调整节点顺序:按需求逻辑排列节点,提升可读性。
输出结果
应用修改后的样式表后,输出XML如下:
<?xml version="1.0" encoding="utf-8"?> <Retrieval> <Payment> <BeneficiaryCountry>US</BeneficiaryCountry> <BeneficiaryStateProvince>CA</BeneficiaryStateProvince> <BeneficiaryCity>SAN FRANCISCO</BeneficiaryCity> <BeneficiaryPostalCode>012345-657</BeneficiaryPostalCode> </Payment> </Retrieval>
内容的提问来源于stack exchange,提问作者OyeRep
相关产品推荐
相关产品推荐

