微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XSLT 更改某些 XSD 元素类型

如何解决XSLT 更改某些 XSD 元素类型

我最近关注了 hal's 问题的 this 答案,并设法将 Protobuf 架构转换为 XSD。

由于我所有的日期/时间元素都定义为字符串,我希望运行一些 XSLT,它会更改名称包含单词“StartDate”或“EndDate”或以“Date”结尾的所有元素,并且是在 xs:string 中输入 xs:date

示例 XSD 条目:

<xs:element name="ActionStartDate" nillable="false" minOccurs="1" type="xs:string" />
<xs:element name="ActionEndDateUpdated" nillable="false" minOccurs="1" type="xs:string" />

预期的 XSD 条目:

<xs:element name="ActionStartDate" nillable="false" minOccurs="1" type="xs:date" />
<xs:element name="ActionEndDateUpdated" nillable="false" minOccurs="1" type="xs:date" />

我已设法使用 hal's XSLT 更改了生成的 XSD 的某些部分,但我不知道如何执行上述操作。

解决方法

通常,您只需将身份转换设置为基本模板(例如,通过声明 <xsl:mode on-no-match="shallow-copy"/>,然后您可以添加一个模板,检查您在匹配模式中命名的条件并执行对 {{1 }} 在模板正文中:

xs:date

这就是您通过 XSLT 代码运行完整 XSD 作为输入的方式,该代码检查您命名的条件并实现类型属性所需的更改。

在 XSLT 1 中,您没有 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="3.0"> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="xs:element[@name[contains(.,'StartDate') or contains(.,'EndDate') or ends-with(.,'Date')]]/@type[. = 'xs:string']"> <xsl:attribute name="{name()}" namespace="{namespace-uri()}">xs:date</xsl:attribute> </xsl:template> </xsl:stylesheet> 来声明身份转换,因此您必须将其拼写出来;此外 xsl:mode 不是 XPath 1.0 函数,因此您需要根据从末尾开始计算的字符串长度进行比较:

ends-with

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。