2015-10-10 4 views
1

Простите меня, я только что узнал XSL, и мне трудно понять шаблоны заявок. В моем понимании. apply-templates найдет узлы, соответствующие select. и поиск в текущем документе xsl, если для указанных узлов выбора существует template. затем примените стиль к этим узлам.Что это означает, что применяются шаблоны select = '*'?

Для примера:

<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>10.90</price> 
     <year>1985</year> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     <country>UK</country> 
     <company>CBS Records</company> 
     <price>9.90</price> 
     <year>1988</year> 
    </cd> 
    <cd> 
     <title>Greatest Hits</title> 
     <artist>Dolly Parton</artist> 
     <country>USA</country> 
     <company>RCA</company> 
     <price>9.90</price> 
     <year>1982</year> 
    </cd> 
</catalog> 


<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 
<body> 
<h2>My CD Collection</h2> 
<xsl:apply-templates/> 
</body> 
</html> 
</xsl:template> 

<xsl:template match="cd"> 
<p> 
<xsl:apply-templates select="title"/> 
<xsl:apply-templates select="artist"/> 
</p> 
</xsl:template> 

<xsl:template match="title"> 
Title: <span style="color:#ff0000"> 
<xsl:value-of select="."/></span> 
<br /> 
</xsl:template> 

<xsl:template match="artist"> 
Artist: <span style="color:#00ff00"> 
<xsl:value-of select="."/></span> 
<br /> 
</xsl:template> 

</xsl:stylesheet> 
  • Первые применяются-шаблоны в <xsl:template match="/">, это означает, что все узлы под корень catalog будет применять указанный шаблон. поскольку для этих узлов уже существует шаблон. поэтому он применит шаблон к этим узлам cd. И так делают и другие применяемые шаблоны. Они работают по тому же правилу.

Но когда я вижу xsl, как показано ниже. на самом деле есть из CruiseControl.NET MsTestReport2010.xsl

<xsl:variable name="runinfos" 
        select="*[local-name()='ResultSummary']/*[local-name()='RunInfos']/*[local-name()='RunInfo']" /> 
    <xsl:if test="count($runinfos) > 0"> 
     <h3>Errors and Warnings</h3> 
     <table width="100%" 
      border="1" 
      cellSpacing="0" 
      style="font-size:small;"> 
     <xsl:apply-templates select="$runinfos" /> 
     </table> 
    </xsl:if> 

в моем понимании xsl:apply-templates select="$runinfos" будет искать XSL документ найти шаблон, определенный для него. который ниже.

<xsl:template match="*[local-name()='RunInfo']"> 
    <tr> 
     <td> 
      <xsl:apply-templates select="*" /> 
     </td> 
    </tr> 
    </xsl:template> 

Но Что делать меня путают то, что это значит select="*". Потому что я вижу в документе xsl .found не существует такого шаблона *.

И еще я задаюсь вопросом: что, если шаблон не соответствует выбранным узлам в xsl:apply-templates?

И как я могу проверить и отладить xsl в некоторых инструментах. Пожалуйста, поделитесь им со мной, если у вас есть хорошие. Спасибо.

Вот XML

<cruisecontrol project="KMIMProject"> 
    <build date="2015-10-09 19:01:32" buildtime="00:00:35" error="true" buildcondition="ForceBuild"> 
     <TestRun id="1bd2dff0-7418-4a1e-8ffd-189b27d1b118" name="[email protected] 2015-10-09 19:01:26" runUser="JOE-WANGPC\Administrator" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010"> 
      <TestSettings name="Default Test Settings" id="6e1f3ea2-9cf0-4beb-8305-1a4b5db1fa55"> 
       <Deployment userDeploymentRoot="E:\study\cc.net\Test\KMIH\WorkingFolder" useDefaultDeploymentRoot="false" runDeploymentRoot="Administrator_JOE-WANGPC 2015-10-09 19_01_26"/> 
       <Execution> 
        <TestTypeSpecific/> 
        <AgentRule name="Execution Agents"> 
     </AgentRule> 
       </Execution> 
       <Properties/> 
      </TestSettings> 
      <Times creation="2015-10-09T19:01:26.3934012+08:00" queuing="2015-10-09T19:01:26.6424154+08:00" start="2015-10-09T19:01:26.7014188+08:00" finish="2015-10-09T19:01:27.1244430+08:00"/> 
      <ResultSummary outcome="Failed"> 
       <Counters total="106" executed="59" error="0" failed="59" timeout="0" aborted="0" inconclusive="0" passedButRunAborted="0" notRunnable="47" notExecuted="0" disconnected="0" warning="0" passed="0" completed="0" inProgress="0" pending="0"/> 
       <RunInfos> 
        <RunInfo computerName="JOE-WANGPC" outcome="Warning" timestamp="2015-10-09T19:01:26.4934069+08:00"> 
         <Text>Warning: Test Run deployment issue: The assembly or module 'KMIH.Persistence' directly or indirectly referenced by the test container 'E:\study\cc.net\Test\KMIH\SourceCheckOutFolder\kmih.unittests\obj\release\kmih.unittests.dll' was not found.</Text> 
        </RunInfo> 
        <RunInfo computerName="JOE-WANGPC" outcome="Warning" timestamp="2015-10-09T19:01:26.4934069+08:00"> 
         <Text>Warning: Test Run deployment issue: The assembly or module 'KMIH.WebUI' directly or indirectly referenced by the test container 'E:\study\cc.net\Test\KMIH\SourceCheckOutFolder\kmih.unittests\obj\release\kmih.unittests.dll' was not found.</Text> 
        </RunInfo> 
       </RunInfos> 
      </ResultSummary> 
     </TestRun> 
    </build> 
</cruisecontrol> 
+1

«Простите, что я только что узнал XSL». Как интересно, как вы научились этому? Потому что, что бы вы ни делали, вы как-то упустили центральную самую важную концепцию на этом языке.Лично, если мне нужно выучить язык, первое, что я делаю, - это купить книгу и прочитать ее на обложке. Некоторые считают это старомодным, или они слишком нетерпеливы и хотят получить результаты мгновенно. Но я не могу использовать язык, пока не пойму его основные понятия, и тот факт, что вы задаете этот вопрос, говорит о том, что вы одинаковы. –

+0

Да, вы полностью правы. Не могли бы вы любезно порекомендовать мне несколько хороших книг. В настоящее время я просто изучаю его в W3cSchool. И попытайтесь выяснить эту проблему, с которой я столкнулся. Я действительно чувствую себя ребенком перед тобой. Простите за это . Пожалуйста, прости меня. –

+0

Моя собственная книга «Справочник программиста XSLT 2.0» - очень всеобъемлющий справочник, который также включает анализ понятий. Если вы предпочитаете более мягкий и более учебный подход, ориентированный на представление концепции сразу, введение Jeni Tennison в XSLT 2.0 может подойти вам лучше. –

ответ

2

Это означает «выбрать все дети элемента и применить шаблоны, которые соответствуют им ". Так что если есть, например, дочерний тег meh и шаблон для любого элемента, соответствующего meh (или более общего соответствия), он применил бы этот шаблон для этого дочернего элемента. apply-templates не выбирает шаблон, он только сообщает движку, что шаблоны должны применяться к выбору (в атрибуте select), и движок должен найти соответствующие шаблоны для них.

Если шаблон не соответствует элементу, XSLT имеет встроенные правила, которые в основном говорят «применять шаблоны ко всем дочерним элементам, а также если есть текстовые узлы, скопируйте их для вывода». Таким образом, в этом случае, поскольку элементы внутри RunInfo не имеют соответствующего шаблона, XSLT просто скопирует текст внутри него на вывод.

+0

Я имею в виду, какие соответствующие шаблоны будут применяться к '*'? Благодарю. –

+0

oh .. Я понял, что вы имеете в виду. Но что, если нет шаблонов, которые бы соответствовали некоторым из них? как отображать такие дочерние узлы? Просто сырой текст? Благодарю. –

+0

@ Joe.Wang Добавлена ​​информация о шаблонах по умолчанию –