我正在使用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();
}
}
答案 0 :(得分:1)
不,对不起,这是不可能的。 XDM数据模型中没有任何内容可以区分由XSD定义的默认值扩展产生的属性。