0

假设我有以下 xml 文档:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="FirstLevel">
    <xs:unique name="uniqueL2inL1">
      <xs:selector xpath="SecondLevel" />
      <xs:field xpath="@Name" />
    </xs:unique>
  </xs:element>
  <xs:element name="SecondLevel">
    <xs:unique name="uniqueL3inL2">
      <xs:selector xpath="ThirdLevel" />
      <xs:field xpath="@Name" />
    </xs:unique>
  </xs:element>
  <xs:element name="ThirdLevel">
    <xs:unique name="uniqueL4inL3">
      <xs:selector xpath="FourthLevel" />
      <xs:field xpath="@Name" />
    </xs:unique>
  </xs:element>
  <xs:element name="FourthLevel"/>
</xs:schema>

有什么可能以正确的顺序获得从ThirdLevel元素到文档根的唯一定义“链”?

例如,我想要的结果输出ThirdLevel

FirstLevel
SecondLevel

要获取FirstLevel(eg root-element) 的节点,我需要查询一个xs:element具有的节点xs:unique,但其名称本身在xs:unique/xs:selector/@xpath. 这个特定的查询是:

<xsl:variable name="root-element" select="//xs:element[xs:unique and not(//xs:element/xs:unique/xs:selector/@xpath = @name)]/@name"/>

现在我需要获取ThirdLevel和 this之间的所有节点$root-element

我有一个template带有两个参数的递归调用(可以附加,但为了清楚起见将其放在一边),它输出所有节点。

是否可以使用一个 xpath 进行查询?

问候

4

1 回答 1

0

我不确定整个方法对于复杂模式和任意 XPath 选择器是否有意义,但是如果当前方法为您提供了您想要的输出,只是顺序错误,那么您可以简单地将输出存储在一个变量中,并在您使用时反转该变量内容输出值:

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" >
  <xsl:output method="text" />
  <xsl:template match="xs:element">
    <xsl:result-document href="chain_{@name}">
      <xsl:variable name="element-name" select="@name"/>
      <xsl:variable name="parent-name" select="//xs:unique/xs:selector[@xpath=$element-name]/@xpath"/>
      <xsl:if test="$parent-name != ''">
        <xsl:variable name="list" as="xs:string*">
          <xsl:call-template name="mytemplate">
            <xsl:with-param name="unique-block" select="//xs:unique/xs:selector[@xpath=$element-name]/.."/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="reverse($list)" separator="&#10;"/>
      </xsl:if>
    </xsl:result-document>
  </xsl:template>
  <xsl:template name="mytemplate">
    <xsl:param name="unique-block"/>
    <xsl:variable name="parent-name" select="$unique-block/../@name"/>
    <xsl:sequence select="$parent-name"/>
    <xsl:variable name="unique-selector" select="//xs:unique/xs:selector[@xpath=$parent-name]/@xpath"/>
    <!-- evaluate and recurse, if needed: -->
    <xsl:if test="$unique-selector != ''">
      <xsl:call-template name="mytemplate">
        <xsl:with-param name="unique-block" select="//xs:unique/xs:selector[@xpath=$parent-name]/.." />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
于 2014-11-11T14:35:35.387 回答