[英]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: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'>
也許是值得<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.