语法2:match - 匹配结构

Python 3.10 引入了新的匹配结构`match ... case ...`,类似于switch case。本文详细介绍了其基础格式、多值选择、if判断、多参数使用和其他特性。通过`|`可以实现多值匹配,`if`条件用于细化匹配,多参数支持解包赋值,同时支持元组、列表和字典解包。此外,`as`关键字可用于捕获子模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 基础格式

2. | 选择多值

3. 添加 if 判断

4. 多参数 

5. 其他特性说明


2021年10月4日,Python正式发布了 3.10 版本,提供匹配结构模式,类似其他语言中的switch ... case ... 结构,即: match ... case ...。

1. 基础格式

match后跟比对参数,当参数与case后比对通过,则执行case下代码块语句;

"_" 作为通配符,并必定匹配成功,即作为兜底措施,所有前置未匹配参数执行 "_" 下代码块;

如果没有 case 语句匹配成功,则不会执行任何分支。

#使用 _ 通配符兜底
for i in range(4):
    match i:
        case 1:
            print(f'输出结果{i}')
        case 2:
            print(f'输出结果{i+i}')
        case 3:
            print(f'输出结果{i+i+i}')
        case _:
            print('waohohoh!')
       
waohohoh!
输出结果1
输出结果4
输出结果9
waohohoh!

#如果没有 case 语句匹配成功,则不会执行任何分支
for i in range(4):
    match i:
        case 1:
            print(f'输出结果{i}')
        case 2:
            print(f'输出结果{i+i}')
        case 3:
            print(f'输出结果{i+i+i}')
         
输出结果1
输出结果4
输出结果9

2. | 选择多值

通过 "|" ,一个case

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" exclude-result-prefixes="w"> <!-- 根模板 --> <xsl:template match="/"> <fo:root> <fo:layout-master-set> <fo:simple-page-master master-name="A4"> <fo:region-body margin="1in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="A4"> <fo:flow flow-name="xsl-region-body"> <xsl:apply-templates select="//w:body"/> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> <!-- 段落处理 --> <xsl:template match="w:p"> <fo:block xsl:use-attribute-sets="paragraph-style"> <xsl:apply-templates select=".//w:r"/> </fo:block> </xsl:template> <!-- 文本格式处理 --> <xsl:template match="w:r"> <fo:inline> <xsl:apply-templates select="w:rPr"/> <xsl:value-of select="w:t"/> </fo:inline> </xsl:template> <!-- 字体样式提取 --> <xsl:template match="w:rPr"> <xsl:if test="w:rFonts/@w:ascii"> <xsl:attribute name="font-family" select="w:rFonts/@w:ascii"/> </xsl:if> <xsl:if test="w:sz/@w:val"> <xsl:attribute name="font-size" select="concat(w:sz/@w:val * 0.5, 'pt')"/> </xsl:if> <xsl:if test="w:color/@w:val"> <xsl:attribute name="color" select="concat('#', w:color/@w:val)"/> </xsl:if> </xsl:template> <!-- 加粗处理 --> <xsl:template match="w:b"> <xsl:attribute name="font-weight">bold</xsl:attribute> </xsl:template> <!-- 斜体处理 --> <xsl:template match="w:i"> <xsl:attribute name="font-style">italic</xsl:attribute> </xsl:template> <!-- 表格处理 --> <xsl:template match="w:tbl"> <fo:table table-layout="fixed" width="100%"> <xsl:apply-templates select="w:tr"/> </fo:table> </xsl:template> <xsl:template match="w:tr"> <fo:table-row> <xsl:apply-templates select="w:tc"/> </fo:table-row> </xsl:template> <xsl:template match="w:tc"> <fo:table-cell border="1pt solid black" padding="2pt"> <fo:block> <xsl:apply-templates select=".//w:p"/> </fo:block> </fo:table-cell> </xsl:template> <!-- 段落默认样式 --> <xsl:attribute-set name="paragraph-style"> <xsl:attribute name="space-after">12pt</xsl:attribute> <xsl:attribute name="text-align">left</xsl:attribute> </xsl:attribute-set> </xsl:stylesheet>完善修改这个xslt样式表,一定要注意这是word的xml转xls-fo的xlst样式表,且xslt版本为3.0,请直接给出修改好的全部结果
最新发布
03-11
<think>嗯,用户让我帮忙修改一个XSLT样式表,这个样式表是用来将Word的XML转换成XSL-FO的,而且版本是3.0。首先,我需要仔细看一下用户提供的现有代码,然后找出需要改进的地方。 首先,用户提供的XSLT已经处理了段落、文本样式、表格等基本结构。但可能有一些细节需要优化。例如,Word的XML结构可能更复杂,比如处理嵌套的表格、列表、超链接、图片等。用户当前的代码中没有处理这些元素,所以可能需要添加这些部分的模板。 接下来,检查现有的模板是否符合XSLT 3.0的规范。例如,是否使用了正确的命名空间,是否有一些过时的语法需要更新。用户提到要特别注意这是Word XML转XSL-FO,所以需要确保所有的元素和属性都正确映射到XSL-FO的对应部分。 然后,看看字体样式的处理。当前的代码中,rFonts可能只处理了ascii字体,但Word中可能还有其他字体设置,比如h-ansi或cs字体,可能需要更全面的处理。另外,字体大小的转换是否正确,将w:sz的val乘以0.5得到pt单位,这个是正确的,因为Word中的字号是半磅的倍数。 表格处理部分,用户当前的模板处理了表格、行和单元格,但可能缺少列宽的定义。在XSL-FO中,表格通常需要定义列的数量和宽度,否则可能无法正确渲染。所以需要添加对w:tblGrid/w:gridCol的处理,生成fo:table-column元素。 段落样式方面,用户可能还需要处理对齐方式,比如左对齐、居中、右对齐等。当前的paragraph-style属性集中设置了text-align为left,但需要根据Word中的实际设置来动态调整,比如处理w:jc元素的值。 另外,Word中的列表(项目符号和编号)在现有代码中没有处理,需要添加对应的模板,将w:numPr转换为fo:list-block等结构。图片处理也是必需的,可能需要处理w:drawing元素,提取图片引用并生成fo:external-graphic。 超链接的处理也是常见的需求,需要处理w:hyperlink元素,生成fo:basic-link,并保留链接地址。 还有,检查属性设置是否正确。例如,加粗和斜体的模板是否被正确应用。当前的代码中,w:b和w:i的模板是在w:rPr的上下文中,可能需要确保这些属性被正确继承到fo:inline元素中。 最后,确保生成的XSL-FO符合规范,能够在Apache FOP等工具中正确渲染为PDF或其他格式。可能需要测试一些边界情况,比如空单元格、合并的单元格、复杂的文本格式组合等。 总结需要改进的地方: 1. 添加缺失的元素处理,如图片、超链接、列表。 2. 完善表格结构,包括列宽定义。 3. 动态处理段落对齐方式。 4. 处理更多文本样式如下划线、删除线。 5. 优化字体家族的处理,考虑更多属性。 6. 添加必要的命名空间和版本声明。 7. 确保XSLT 3.0特性的正确使用,如模式匹配、属性集等。 8. 处理页眉页脚(如果用户需要的话,但当前代码中没有涉及,可能需要询问用户,但根据问题描述,用户可能希望保持简单,所以暂时不添加)。 现在根据这些思考,逐步修改XSLT代码,添加必要的模板和属性处理,确保兼容性和正确性。</think>$$xsl:stylesheet version="3.0"$$ 开头的代码需要转义,因此完整修改后的XSLT如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" exclude-result-prefixes="w wp r"> <!-- 增强的布局主控设置 --> <xsl:template match="/"> <fo:root> <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm"> <fo:region-body margin="1in" column-count="1"/> <fo:region-before extent="0.5in"/> <fo:region-after extent="0.5in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="A4"> <fo:flow flow-name="xsl-region-body"> <xsl:apply-templates select="//w:body"/> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> <!-- 增强的段落处理 --> <xsl:template match="w:p"> <fo:block xsl:use-attribute-sets="paragraph-style"> <xsl:call-template name="apply-paragraph-properties"/> <xsl:apply-templates/> </fo:block> </xsl:template> <!-- 文本格式增强处理 --> <xsl:template match="w:r"> <fo:inline> <xsl:apply-templates select="w:rPr"/> <xsl:apply-templates select="w:t | w:drawing"/> </fo:inline> </xsl:template> <!-- 增强的字体样式 --> <xsl:template match="w:rPr"> <xsl:if test="w:rFonts/@w:ascii or w:rFonts/@w:hAnsi">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃烧的火鸟啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值