Schema Aware XSL 2.0:如何在转换过程中区分源XML和模式的值?

时间:2015-08-12 21:28:19

标签: xml xslt schema xslt-2.0 default-value

我正在使用XSLT 2.0进行模式感知转换。我有一个源XML文档,这里有一个示例节点:

<ns:IssueNumber>
    <ns:Value>7232</ns:Value>
</ns:IssueNumber>

这是定义该节点的架构:

<xs:element name="IssueNumber">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="ns:Value"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="optional" fixed="$issueNum"/>
        <xs:attribute name="nickname" type="xs:string" use="optional" default="Issue Number"/>
    </xs:complexType>
</xs:element>

当我使用身份转换时:

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

变换器(XMLSpy 2013)始终填写所有这些属性的默认值。

<ns:IssueNumber nickname="Issue Number" name="$issueNum">
    <ns:Value>7232</ns:Value>
</ns:IssueNumber>

我希望能够为这些属性设置不同的输出行为,但是,它们是基于它们是否在原始XML输入中设置(而不是由模式的类型定义提供)。我也希望能够比较这些属性&#39;值为默认值。

我的基本问题是:是否有一个 xsl:test 表达式,用于区分属性或元素的值是由输入还是由架构设置的?

我想在以下几行中执行某些操作,并使其在所有属性中具有通用性。如果解决方案特定于我所描述的模式,那对我没有多大帮助。

// Algorithm
// (I know this is clearly not similar to XSL syntax.)
//
For each attribute A in (Set of all attributes)
{
    if (A.value was set by Schema)
    {
        doBehaviorX();
    }
    else if (A.value == A.DefaultSchemaValue)
    {
        doBehaviorY();
    }
    else
    {
        doDefaultBehavior();
    }
}

1 个答案:

答案 0 :(得分:1)

不,对不起,这是不可能的。 XDM数据模型中没有任何内容可以区分由XSD定义的默认值扩展产生的属性。