使用模式感知 XSLT 的代码覆盖率警告
Code coverage warning using schema aware XSLT
我很感兴趣是否有任何代码覆盖警告 - 基本上警告说代码行或代码段无法进行类型检查,或者任何确保此类段不存在的基本技术。
为了说明我有一个 XSD.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:complexType name="SQUARETYPE">
<xs:sequence>
<xs:element name="contains">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="kind"/>
<xs:attribute name="width" type="xs:int"/>
<xs:attribute name="x" type="xs:int"/>
<xs:attribute name="y" type="xs:int"/>
</xs:complexType>
<xs:complexType name="FILLEDSQUARETYPE">
<xs:sequence>
<xs:element name="contains">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="kind"/>
<xs:attribute name="colour" type="xs:string"/>
<xs:attribute name="width" type="xs:int"/>
<xs:attribute name="x" type="xs:int"/>
<xs:attribute name="y" type="xs:int"/>
</xs:complexType>
<xs:complexType name="TRIANGLETYPE">
<xs:sequence>
<xs:element name="contains">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="rotation" type="xs:int"/>
<xs:attribute name="x" type="xs:int"/>
<xs:attribute name="y" type="xs:int"/>
</xs:complexType>
<xs:element name="SQUARE">
<xs:alternative test="@kind = 'FILLEDSQUARETYPE'" type="FILLEDSQUARETYPE"/>
<xs:alternative test="@kind = 'SQUARETYPE'" type="SQUARETYPE"/>
<xs:alternative type="xs:error"/>
</xs:element>
<xs:element name="TRIANGLE">
<xs:alternative type="TRIANGLETYPE"/>
</xs:element>
<xs:element name="rootShape">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
和一个 xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="xs msxsl"
version="2.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0"/>
<xsl:import-schema schema-location="MessingAbout.xsd"/>
<xsl:template match="/">
<xsl:apply-templates select="schema-element(SQUARE)"/>
</xsl:template>
<xsl:template match="element(SQUARE,FILLEDSQUARETYPE)">
<foo>
<xsl:value-of select="@colour"/>
</foo>
</xsl:template>
</xsl:stylesheet>
我认为这具有 100% 的覆盖率(尽管未检查“/”上的初始匹配)。
如果我要修改 xslt 说这个。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="xs msxsl"
version="2.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0"/>
<xsl:import-schema schema-location="MessingAbout.xsd"/>
<xsl:template match="/">
<xsl:apply-templates select="SQUARE"/>
</xsl:template>
<xsl:template match="element(SQUARE,FILLEDSQUARETYPE)">
<foo>
<xsl:value-of select="@colour"/>
</foo>
</xsl:template>
</xsl:stylesheet>
然后是行
<xsl:apply-templates select="SQUARE"/>
没有检查,我可以用“SQUARE1”替换“SQUARE”,这不会被检查(可以理解)。
是否可以打开一些警告我的设置?所以我可以强制我的 XSLT 始终进行类型检查? (即使这排除了某些“有效”但不可检查类型的程序(这是一种常见的权衡))。
都是类型检查,但是静态类型检查的彻底程度取决于有多少类型信息可用。所以它不是黑白的 0% 或 100%。基本上,在编译时,处理器会尽其所能进行类型检查,并将其余部分推迟到 运行 时间。有一些检查即使在理论上可行,Saxon 也不会尝试,例如任何涉及除子项、属性和后代以外的轴的任何检查。
我很感兴趣是否有任何代码覆盖警告 - 基本上警告说代码行或代码段无法进行类型检查,或者任何确保此类段不存在的基本技术。
为了说明我有一个 XSD.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:complexType name="SQUARETYPE">
<xs:sequence>
<xs:element name="contains">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="kind"/>
<xs:attribute name="width" type="xs:int"/>
<xs:attribute name="x" type="xs:int"/>
<xs:attribute name="y" type="xs:int"/>
</xs:complexType>
<xs:complexType name="FILLEDSQUARETYPE">
<xs:sequence>
<xs:element name="contains">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="kind"/>
<xs:attribute name="colour" type="xs:string"/>
<xs:attribute name="width" type="xs:int"/>
<xs:attribute name="x" type="xs:int"/>
<xs:attribute name="y" type="xs:int"/>
</xs:complexType>
<xs:complexType name="TRIANGLETYPE">
<xs:sequence>
<xs:element name="contains">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="rotation" type="xs:int"/>
<xs:attribute name="x" type="xs:int"/>
<xs:attribute name="y" type="xs:int"/>
</xs:complexType>
<xs:element name="SQUARE">
<xs:alternative test="@kind = 'FILLEDSQUARETYPE'" type="FILLEDSQUARETYPE"/>
<xs:alternative test="@kind = 'SQUARETYPE'" type="SQUARETYPE"/>
<xs:alternative type="xs:error"/>
</xs:element>
<xs:element name="TRIANGLE">
<xs:alternative type="TRIANGLETYPE"/>
</xs:element>
<xs:element name="rootShape">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SQUARE"/>
<xs:element ref="TRIANGLE"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
和一个 xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="xs msxsl"
version="2.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0"/>
<xsl:import-schema schema-location="MessingAbout.xsd"/>
<xsl:template match="/">
<xsl:apply-templates select="schema-element(SQUARE)"/>
</xsl:template>
<xsl:template match="element(SQUARE,FILLEDSQUARETYPE)">
<foo>
<xsl:value-of select="@colour"/>
</foo>
</xsl:template>
</xsl:stylesheet>
我认为这具有 100% 的覆盖率(尽管未检查“/”上的初始匹配)。
如果我要修改 xslt 说这个。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="xs msxsl"
version="2.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0"/>
<xsl:import-schema schema-location="MessingAbout.xsd"/>
<xsl:template match="/">
<xsl:apply-templates select="SQUARE"/>
</xsl:template>
<xsl:template match="element(SQUARE,FILLEDSQUARETYPE)">
<foo>
<xsl:value-of select="@colour"/>
</foo>
</xsl:template>
</xsl:stylesheet>
然后是行
<xsl:apply-templates select="SQUARE"/>
没有检查,我可以用“SQUARE1”替换“SQUARE”,这不会被检查(可以理解)。
是否可以打开一些警告我的设置?所以我可以强制我的 XSLT 始终进行类型检查? (即使这排除了某些“有效”但不可检查类型的程序(这是一种常见的权衡))。
都是类型检查,但是静态类型检查的彻底程度取决于有多少类型信息可用。所以它不是黑白的 0% 或 100%。基本上,在编译时,处理器会尽其所能进行类型检查,并将其余部分推迟到 运行 时间。有一些检查即使在理论上可行,Saxon 也不会尝试,例如任何涉及除子项、属性和后代以外的轴的任何检查。