【问题标题】:XSLT: Copy child elements of a complex type only onceXSLT:仅将复杂类型的子元素复制一次
【发布时间】:2017-11-10 19:58:25
【问题描述】:

我有以下输入结构:

<complexType name="InvoiceType">
  <xs:element name="AdressIn"      type="AdressType"/>
  <xs:element name="AdressOut"     type="AdressType" />
  <xs:element name="Partner"       type="PartnerType" />
  <xs:element name="Date"          type="DateType"/>
</complexType>

所有引用的类型(AdressType、PartnerType、DateType)也作为复杂类型包含在该文档中(除了许多其他类型)。

我要做的是复制“InvoiceType”中使用的类型 到新文档。 我的问题是,AdressType 在 InvoiceType 中的使用不止一次,因此它在我的新文档中出现的次数不止一次。我怎样才能防止这种情况? 我需要类似“如果已经处理->跳过”之类的东西,但这不是声明性的……也许 xslt 不是实现这一目标的正确方法。

感谢您的帮助!

编辑:

我目前使用的 XSLT 看起来像这样(修改以取悦简单的示例)

<xsl:template match="xs:complexType"> 
<xsl:for-each select="./xs:element">      
  <xsl:variable name="elementType"><xsl:value-of select="@type"></xsl:value-of></xsl:variable>
  <xsl:copy-of copy-namespaces="no" select="/xs:schema/xs:complexType[@name=$elementType]"/>
</xsl:for-each>

我正在为 InvoceType 应用该模板。基本上我会扔掉它的内容,看看引用了哪些类型,通过他们的名字在文档中查找它们并复制它们。

【问题讨论】:

  • 那么你目前使用的是什么?您需要消除重复的地方,是否可以使用distinct-values、分组或简单地使用/. 消除重复取决于您到目前为止输出类型的内容。向我们展示相关的 XSLT

标签: xslt


【解决方案1】:

而不是

<xsl:for-each select="./xs:element">      
  <xsl:variable name="elementType"><xsl:value-of select="@type"></xsl:value-of></xsl:variable>
  <xsl:copy-of copy-namespaces="no" select="/xs:schema/xs:complexType[@name=$elementType]"/>
</xsl:for-each>

使用

<xsl:copy-of select="/xs:schema/xs:complexType[@name=current()/xs:element/@type]"/>

或定义一个键

<xsl:key name="complex-types" match="xs:schema/xs:complexType" use="@name"/>

然后你可以使用

<xsl:copy-of select="key('complex-types', xs:element/@type)"/>

【讨论】:

  • 我只是尝试了两种方法,但无法使其正常工作。什么都没有打印出来。可以肯定的是,我应该将这些行放在我上面发布的 complexType 模板中,对吧?
  • 如果之前的代码有效,那么可以,用该代码替换模板内的for-each。但是您的输入 sn-p 似乎并不完整,因此很难发布可测试的建议,您可能希望发布一个最小但完整的模式以及输出重复类型的最小但完整的样式表,那么我确定如果需要,我可以调整答案。
  • 哇,它的工作原理!不得不修复路径。非常感谢!但是,tbh,我仍然不知道该表达式的哪个部分负责“消除”重复项......但无论如何,感谢您的时间和精力!
  • 路径表达式选择节点确实消除了重复w3.org/TR/xpath/#id-path-operator“如果E2的每次评估都返回一个(可能为空的)节点序列,则将这些序列组合起来,并根据节点身份消除重复节点。” . key 做到了,w3.org/TR/xslt/#func-key,“函数的结果是一系列节点,按照文档顺序并删除了重复项”。
猜你喜欢
  • 2016-07-17
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多