簡體   English   中英

首次XSLT:調用模板,帶參數,XPath位置路徑

[英]First-time XSLT: call-template, with-param, XPath location path

這是我想用XSLT解析的xml文件:

<?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”變量不正確。

我假設您的us:TopLevelTagut:TopLevelTag

ut:TopLevelTag/ut:SecondLevelTag[1]/ut:ThirdLevelTag[100]匹配任何內容,因為ut:TopLevelTag/ut:SecondLevelTag[1]是一個完全位於ut:ThirdLevelTag上的元素。 因此,整個xslt表達式不匹配任何內容。

作為一般准則,立即嘗試對完整路徑進行編碼通常既沒有必要,也不一定是一個好主意。 我不知道您在上述內容中到底要實現什么(我想您應該嘗試使用較小的示例來發布問題),但是長期匹配並檢查<xsl:for-each select='.//ot:SixthLevelTag'>也許是值得<xsl:for-each select='.//ot:SixthLevelTag'>

您需要從第二個模板中刪除match屬性,否則會出錯(該模板將使用空參數自動調用。)然后,如果您清理示例xml中的混亂內容(使關閉標簽匹配打開,請使用有效的名稱空間前綴)等)。

這個有很多問題。 首先,您的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:調用模板對於您要嘗試執行的操作是不必要的,這將獲取所有SeventhLevelTag:

<?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>

在瀏覽器中運行此程序將為您提供所需的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM