2017-01-25 2 views
0

Посмотрите на XSLT-код по адресу http://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_apply ... Ниже вы найдете первую часть этого кода (и один решающим для моего вопроса):<apply-templates /> vs <apply-templates select = "..." /> в XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<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:apply-templates/> 

в

<xsl:apply-templates select="cd"/> 

преобразование не ш орк больше ... (код теперь выглядит следующим образом :)

<?xml version="1.0" encoding="UTF-8"?> 
<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 select="cd"/> <!--ONLY LINE OF CODE THAT WAS CHANGED--> 
</body> 
</html> 
</xsl:template> 

Мой вопрос: Почему изменение взломать код? На мой взгляд, логика одинакова в обоих случаях:

  1. применить шаблон соответствия «CD»
  2. внутри шаблона «CD» применяются два других шаблонов («название» + «группа»)

UPDATE:

весь код XSLT выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<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> 

Вот отрывок из XML:

<?xml version="1.0" encoding="UTF-8"?> 
<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> 
    ...... 
</catalog> 
+0

Можете ли вы изменить свой вопрос, чтобы включить образец XML, поэтому этот вопрос может быть «автономным» и не полагаться на то, чтобы щелкнуть его до W3Schools. Благодаря! –

ответ

3

Что W3C школы не говорит вам о XSLT-х Built-in Template Rules.

Когда вы делаете <xsl:apply-templates select="cd"/>, вы находитесь на узле документа, который является родительским элементом элемента catalog. Выполнение select="cd" ничего не выберет, потому что cd - это дочерний элемент catalog, а не дочерний узел самого документа. Только catalog является ребенком.

(Обратите внимание, что catalog является «корневым элементом» XML. XML-документ может иметь только один корневой элемент).

Однако, когда вы делаете <xsl:apply-templates />, это эквивалентно <xsl:apply-templates select="node()" />, который выберет элемент catalog. Здесь вы можете использовать встроенные шаблоны. У вас нет шаблона, соответствующего catalog в вашем XSLT, и поэтому используется встроенный.

<xsl:template match="*|/"> 
    <xsl:apply-templates/> 
</xsl:template> 

(Здесь * соответствует любому элементу). Таким образом, этот встроенный шаблон будет выбирать дочерние узлы catalog и, таким образом, сопоставить другие шаблоны в вашем XSLT.

Обратите внимание, что в вашем втором примере, вы можете изменить шаблон матч к этому ...

<xsl:template match="/*"> 

Это будет соответствовать catalog элемент, и так потом <xsl:apply-templates select="cd" /> будет работать.