2012-03-29 28 views
0

这里是我想用XSLT解析XML文件:首次XSLT:调用模板,用-PARAM,XPath位置路径

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<?xml-stylesheet type="text/xsl" href="myXSLTSheet.xsl" ?> 
<us:TopLevelTag xmlns:ut='http://www.umbrellacorp.com/oagis/1' xmlns:ot='http://www.openapplications.org/oagis/9' > 
    <ut:SecondLevelTag> 
    <ut:ThirdLevelTag> 
    </ut:ThirdLevelTag> 
    </ut:SecondLevelTag> 
    <ut:SecondLevelTag> 
    <ut:ThirdLevelTag> 
      <ut:FourthLevelTag>       
      <ot:FifthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing1</ot:SeventhLevelTag> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing2</ot:SeventhLevelTag> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing3</ot:SeventhLevelTag> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing4</ot:SeventhLevelTag> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing5</ot:SeventhLevelTag> 
       </ot:SixthLevelTag> 
      </ot:FifthLevelTag> 
      <ot:FifthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag2>Thing6</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing7</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing8</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing9</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing10</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing11</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing12</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing13</ot:SeventhLevelTag2> 
      <ot:SeventhLevelTag2>Thing14</ot:SeventhLevelTag2> 
      <ot:SeventhLevelTag2>Thing15</ot:SeventhLevelTag2> 
       </ot:SixthLevelTag> 
      </ot:FifthLevelTag>     
     </ut:FourthLevelTag>    
     </ut:ThirdLevelTag> 
    </ut:SecondLevelTag1> 
</us:TopLevelTag> 

这里是XLST文件做解析:

<?xml version="1.0"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version ="1.0" 

     xmlns:ut="http://www.umbrellacorp.com/oagis/1" xmlns:ot="http://www.openapplications.org/oagis/9" > 

<xsl:template match="/"> 

    <xsl:call-template name="spec1"> 
     <xsl:with-param name="match" select="ut:TopLevelTag/ut:SecondLevelTag[1]/ut:ThirdLevelTag[100]/ut:FourthLevelTag[1]/ot:FifthLevelTag[1]" /> 
    </xsl:call-template> 

</xsl:template> 

<xsl:template match="/" name="spec1"> 

    <xsl:param name="match" /> 

    <xsl:for-each select="$match/ot:SixthLevelTag"> 

     Value: <xsl:value-of select="ot:SeventhLevelTag"/><br/> 

    </xsl:for-each> 

</xsl:template> 

</xsl:stylesheet> 

请帮忙,xslt文件不会返回任何东西。我认为模板“匹配”属性可能被设置错误,或者我错误地使用了“param”变量。

+0

我的猜测是,您没有使用XML/XSLT感知IDE,因为它会解决您的XML无效的问题。我个人使用Oxygen XML,但这需要花钱。 Netbeans有一个免费的XSLT插件,似乎可以工作,可能值得一试 – Kevan 2012-03-29 20:11:05

回答

0

我假设你的us:TopLevelTag意思是ut:TopLevelTag

ut:TopLevelTag/ut:SecondLevelTag[1]/ut:ThirdLevelTag[100]什么也没有匹配,因为ut:TopLevelTag/ut:SecondLevelTag[1]是一个正好在ut:ThirdLevelTag之内的元素。因此,整个xslt表达式都不匹配。

作为一般指导原则,尝试一次编码完整路径通常既不必要也不一定是个好主意。我不知道你在上面想要达到什么目的(我的猜测是你应该尝试用更小的例子来发布问题),但是这可能是值得放弃长时间比赛并且仅仅检查<xsl:for-each select='.//ot:SixthLevelTag'>

0

您需要删除从第二模板比赛属性,否则它是一个错误(该模板将与空参数自动调用。)然后,如果你收拾烂摊子的示例XML(请关闭标签匹配打开,使用有效的命名空间前缀等),它将起作用。

0

这个问题很多。首先,你的XML格式不正确(参见Thing1等),并且有一个名称空间前缀“us”没有声明。我改变了一些事情,创造一个有效的XML文档:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<?xml-stylesheet type="text/xsl" href="myXSLTSheet.xsl" ?> 
<ut:TopLevelTag xmlns:ut='http://www.umbrellacorp.com/oagis/1' xmlns:ot='http://www.openapplications.org/oagis/9' > 
    <ut:SecondLevelTag> 
    <ut:ThirdLevelTag> 
    </ut:ThirdLevelTag> 
    </ut:SecondLevelTag> 
    <ut:SecondLevelTag1> 
    <ut:ThirdLevelTag> 
      <ut:FourthLevelTag>       
      <ot:FifthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing1</ot:SeventhLevelTag1> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing2</ot:SeventhLevelTag1> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing3</ot:SeventhLevelTag1> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing4</ot:SeventhLevelTag1> 
       </ot:SixthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag1>Thing5</ot:SeventhLevelTag1> 
       </ot:SixthLevelTag> 
      </ot:FifthLevelTag> 
      <ot:FifthLevelTag> 
       <ot:SixthLevelTag> 
        <ot:SeventhLevelTag2>Thing6</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing7</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing8</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing9</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing10</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing11</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing12</ot:SeventhLevelTag2> 
        <ot:SeventhLevelTag2>Thing13</ot:SeventhLevelTag2> 
      <ot:SeventhLevelTag2>Thing14</ot:SeventhLevelTag2> 
      <ot:SeventhLevelTag2>Thing15</ot:SeventhLevelTag2> 
       </ot:SixthLevelTag> 
      </ot:FifthLevelTag>     
     </ut:FourthLevelTag>    
     </ut:ThirdLevelTag> 
    </ut:SecondLevelTag1> 
</ut:TopLevelTag> 

我继续简化了XSLT,以及:调用模板是不必要的你正在尝试做的,这是越来越所有SeventhLevelTags的:

<?xml version="1.0"?> 

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version ="1.0" 

      xmlns:ut="http://www.umbrellacorp.com/oagis/1" xmlns:ot="http://www.openapplications.org/oagis/9" > 

    <xsl:template match="/"> 

     <xsl:for-each select="//ot:SeventhLevelTag"> 

      Value: <xsl:value-of select="."/><br/> 

     </xsl:for-each> 

    </xsl:template> 

</xsl:stylesheet> 

在浏览器中运行此应用程序会给你你要找的。