我正试图根据祖先的名称从节点中删除一个属性。
这是我的模板。我正在尝试删除所有minOccurrs
属性,除非祖先是updateCurrentObjective
。
<xsl:template match="@minOccurs">
<xsl:if test="0 = count(ancestor::node()[name() = 'updateCurrentObjective'])">
<xsl:copy/>
</xsl:if>
</xsl:template>
因此,对于下面的XML,它应该删除该属性。
<xs:extension base="tns:planElement">
<xs:sequence>
<xs:element minOccurs="0" name="action" type="xs:string"/>
</xs:sequence>
<xs:extension>
但对于以下内容,它应该保持原样。
<xs:complexType name="updateCurrentObjective">
<xs:sequence>
<xs:element minOccurs="0" name="currentObjective" type="tns:objective"/>
</xs:sequence>
</xs:complexType>
想法?
我有两个模板规则:
<xsl:template match="@minOccurs"/>
<xsl:template match="*[@name='updateCurrentObjective']//@minOccurs">
<xsl:copy/>
</xsl:template>
是否要操作架构?在这种情况下,我认为name() = 'updateCurrentObjective'
不会有祖先,而是@name = 'updateCurrentObjective'
会有元素。
所以使用
<xsl:template match="@minOccurs[not(ancestor::*[@name = 'updateCurrentObjective'])]"/>
以避免复制CCD_ 5属性。
应该这样做。也可以将谓词放在模板匹配中,但这超出了我的能力。
我还假设您正在尝试转换xsd
本身(而不是与之匹配的文档的实例(
<xsl:template match="@minOccurs">
<xsl:if test="parent::*[1]//ancestor::*[@name='updateCurrentObjective']">
<xsl:copy/>
</xsl:if>
</xsl:template>
基本上,从元素追溯到父元素,然后查看它的任何祖先是否具有属性name='updateCurrentObjective'
。如果可以的话,可以使用更具体的元素名称来替换*
的。