2015-01-09 53 views
0

我是XPath和XSLT的新手。我正在編寫一個XSLT,它在輸入中找到任何'complexType'作爲類型屬性時遞歸地應用模板。在XSLT中遞歸應用模板時的問題

請注意,識別復​​雜類型的邏輯工作正常,所以我不打擾。

下面是我的XML模式輸入:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema attributeFormDefault="unqualified" 
    elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="Object1"> 
     <xs:all> 
      <xs:element minOccurs="0" name="segment-1" type="xs:string" /> 
      <xs:element minOccurs="0" name="segment-2" type="xs:string" /> 
      <xs:element minOccurs="0" name="complexType1" type="anyComplexType" /> 
     </xs:all> 
    </xs:complexType> 
    <xs:complexType name="anyComplexType"> 
     <xs:all> 
      <xs:element minOccurs="0" name="complexType2" type="anotherComplexType" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="anyComplexType"> 
     <xs:all> 
      <some Element> 
     </xs:all> 
    </xs:complexType> 
</xs:schema> 

,這是XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.approuter.com/schemas/cdk/api/"> 

    <xsl:output indent="yes" xml:space="preserve" method="xml" /> 

    <xsl:variable name="ObjectType" select=" 'Object1' " /> 
    <xsl:template match="/"> 
     <xsl:element name="object"> 
      <xsl:attribute name="name" select="$ObjectType" /> 
      <xsl:attribute name="label" select="$ObjectType" /> 
      <xsl:attribute name="minCount">1</xsl:attribute> 
      <xsl:attribute name="maxCount">1</xsl:attribute> 
      <xsl:apply-templates select="//*:complexType[@name = $ObjectType]" /> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="*:complexType"> 
     <!-- Logic to fing complexType' goes here --> 
     <xsl:call-template name="Elements" /> 
    </xsl:template> 
    <xsl:template name="Elements"> 
     <xsl:apply-templates select="//*:complexType[@name [email protected]]" /> 
    </xsl:template> 
</xsl:stylesheet> 

解釋如下流程:

  1. XSLT開始從根讀取輸入。
  2. 創建對象元素,然後應用複雜類型名稱爲Object1的另一個模板(ComplexTypeTemplate)。
  3. ComplexType模板正在執行一些邏輯以將complexType標識爲類型屬性,然後調用另一個名爲'Element'的模板。
  4. 元素模板再次調用complexType模板,以便爲complexType類型應用相同的邏輯。

第4步不適用於我。我相信這裏有一些XPath模式或路徑問題。發生

+0

在這種情況下是否可以顯示您期望的輸出?謝謝! –

+0

嗨Pooja。如果您再次登錄,請考慮接受下面的答案。爲此,請單擊答案左側的刻度線,將問題標記爲已解決。謝謝。 – halfer

回答

1

你的主要問題,在這一行:

<xsl:apply-templates select="//*:complexType[@name = @type]" /> 

您正在尋找任何xs:complexTypename屬性自己的@type屬性相匹配。但是沒有xs:complexType元素,它甚至有type屬性。

這是xs:element具有type屬性,但是當您執行xsl:apply-templates時,您位於xs:complexType元素上。調用命名模板不會更改您的上下文。

要解決此問題,您可以更改命名模板Elements以包含代碼以選擇element元素。您還需要使用current()功能是指當前的上下文(element而非complexType您要選擇)

<xsl:template name="Elements"> 
    <xsl:for-each select="*/*:element"> 
     <xsl:apply-templates select="//*:complexType[@name = current()/@type]" /> 
    </xsl:for-each> 
</xsl:template> 

它可能是更好地與命名模板做掉,雖然,和使用而不是模板匹配。試試這個XSLT

試試這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.approuter.com/schemas/cdk/api/"> 

    <xsl:output indent="yes" xml:space="preserve" method="xml" /> 

    <xsl:variable name="ObjectType" select=" 'Object1' " /> 
    <xsl:template match="/"> 
     <xsl:element name="object"> 
      <xsl:attribute name="name" select="$ObjectType" /> 
      <xsl:attribute name="label" select="$ObjectType" /> 
      <xsl:attribute name="minCount">1</xsl:attribute> 
      <xsl:attribute name="maxCount">1</xsl:attribute> 
      <xsl:apply-templates select="//*:complexType[@name = $ObjectType]" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*:complexType"> 
     <xsl:value-of select="@name" /> 
     <xsl:apply-templates select="*/*:element" /> 
    </xsl:template> 

    <xsl:template match="*:element"> 
     <xsl:apply-templates select="//*:complexType[@name = current()/@type]" /> 
    </xsl:template> 
</xsl:stylesheet> 

需要注意的是,它實際上可能是更好的使用xsl:key來查找complexType記錄。試試這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.approuter.com/schemas/cdk/api/"> 

    <xsl:output indent="yes" xml:space="preserve" method="xml" /> 
    <xsl:key name="complexType" match="*:complexType" use="@name" /> 

    <xsl:variable name="ObjectType" select=" 'Object1' " /> 
    <xsl:template match="/"> 
     <xsl:element name="object"> 
      <xsl:attribute name="name" select="$ObjectType" /> 
      <xsl:attribute name="label" select="$ObjectType" /> 
      <xsl:attribute name="minCount">1</xsl:attribute> 
      <xsl:attribute name="maxCount">1</xsl:attribute> 
      <xsl:apply-templates select="key('complexType', $ObjectType)" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*:complexType"> 
     <xsl:value-of select="@name" /> 
     <xsl:apply-templates select="*/*:element" /> 
    </xsl:template> 

    <xsl:template match="*:element"> 
     <xsl:apply-templates select="key('complexType', @type)" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

現在它的工作! :) 非常感謝!! –