Первый раз XSLT: шаблон вызова, with-param, путь расположения XPath - PullRequest
0 голосов
/ 29 марта 2012

Вот XML-файл, который я хочу проанализировать с помощью XSLT:

<?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ничего не возвращаетЯ думаю, что атрибуты шаблона "match" могут быть установлены неправильно или я неправильно использую переменную "param".

Ответы [ 3 ]

0 голосов
/ 29 марта 2012

Вам нужно удалить атрибут match из второго шаблона, в противном случае это ошибка (шаблон будет автоматически вызываться с пустым параметром.) Затем, если вы очистите беспорядок в своем примере xml (make закрывающие теги соответствуют открывающим, используйте действительные префиксы пространства имен и т. д.) это будет работать.

0 голосов
/ 29 марта 2012

Много проблем с этим. Во-первых, ваш 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>

Запуск этого в браузере должен дать вам то, что вы ищете.

0 голосов
/ 29 марта 2012

Я предполагаю, что ваш 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'>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...