2010-04-23 1 views
2

Я преобразовал mny таблицу стилей, чтобы использовать шаблоны приложений вместо шаблонов вызовов, и это отлично работало для моего другого стиля, что было более сложным, но это не похоже на работа даже считала, что это гораздо более простой шаблон.XSL применять шаблоны не работают ... может быть ошибка XPath

Все, что он выводит, это секс-узел и узел пользовательского уровня. Я думаю, что это связано с моим Xpath.

Все, что я хочу, чтобы вывести < пользователя> информации, ничего

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template name="hoo" match="/"> 
     <html> 
      <head> 
       <title>Registered Members</title> 
       <link rel="stylesheet" type="text/css" href="user.css" /> 
      </head> 
      <body> 
       <h1>Registered Members</h1> 
       <xsl:for-each select="folktask/member/user"> 

        <div class="userdiv"> 

         <xsl:apply-templates/> 

        </div> 
       </xsl:for-each> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="folktask/member/user"> 
     <xsl:apply-templates select="@id"/> 
     <xsl:apply-templates select="personal/name"/> 
     <xsl:apply-templates select="personal/address1"/> 
     <xsl:apply-templates select="personal/city"/> 
     <xsl:apply-templates select="personal/county"/> 
     <xsl:apply-templates select="personal/postcode"/> 
     <xsl:apply-templates select="personal/telephone"/> 
     <xsl:apply-templates select="personal/mobile"/> 
     <xsl:apply-templates select="personal/email"/> 
     <xsl:apply-templates select="personal"/> 
     <xsl:apply-templates select="account/username"/> 
     <xsl:apply-templates select="account"/> 
    </xsl:template> 

    <xsl:template match="@id"> 
     <div class="heading bold"><h2>USER ID: <xsl:value-of select="." /></h2></div> 
    </xsl:template> 

    <xsl:template match="personal/name"> 
     <div class="small bold">NAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/address1"> 
     <div class="small bold">ADDRESS:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/city"> 
     <div class="small bold">CITY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/county"> 
     <div class="small bold">COUNTY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/postcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/telephone"> 
     <div class="small bold">TELEPHONE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/mobile"> 
     <div class="small bold">MOBILE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal/email"> 
     <div class="small bold">EMAIL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:text>mailto:</xsl:text> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal"> 
    <div class="small bold">SEX:</div> 
    <div class="colored bold"> 
     <xsl:choose> 
      <xsl:when test="sex='Male'"> 
       <div class="sex male"><xsl:value-of select="sex/."/></div> 
      </xsl:when> 
      <xsl:otherwise> 
       <div class="sex female"><xsl:value-of select="sex/."/></div> 
      </xsl:otherwise> 
     </xsl:choose> 
    </div> 
    </xsl:template> 

    <xsl:template match="account/username"> 
     <div class="small bold">USERNAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 


    <xsl:template match="account"> 
     <div class="small bold">ACCOUNT TYPE:</div> 
     <div class="colored "> 
     <xsl:choose> 
      <xsl:when test="userlevel='1'"> 
       <div class="nml bold">Normal User</div> 
      </xsl:when> 

      <xsl:when test="userlevel='2'"> 
       <div class="vol bold">Volunteer</div> 
      </xsl:when> 

      <xsl:when test="userlevel='3'"> 
       <div class="org bold">Organiser</div> 
      </xsl:when> 

      <xsl:otherwise> 
       <div class="name adm bold">Administrator</div> 
      </xsl:otherwise> 
     </xsl:choose> 
     </div> 
    </xsl:template> 

</xsl:stylesheet> 

и некоторые из моего XML

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<?xml-stylesheet type="text/xsl" href="users.xsl"?> 
<folktask xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="folktask.xsd"> 
    <member> 
     <user id="1"> 
      <personal> 
       <name>Abbie Hunt</name> 
       <sex>Female</sex> 
       <address1>108 Access Road</address1> 
       <address2></address2> 
       <city>Wells</city> 
       <county>Somerset</county> 
       <postcode>BA5 8GH</postcode> 
       <telephone>01528927616</telephone> 
       <mobile>07085252492</mobile> 
       <email>[email protected]</email> 
      </personal> 
      <account> 
       <username>AdRock</username> 
       <password>269eb625e2f0cf6fae9a29434c12a89f</password> 
       <userlevel>4</userlevel> 
       <signupdate>2010-03-26T09:23:50</signupdate> 
      </account> 
     </user> 
     <volunteer id="1"> 
      <roles></roles> 
      <region>South West</region> 
     </volunteer> 
    </member> 
    <member> 
     <user id="2"> 
      <personal> 
       <name>Aidan Harris</name> 
       <sex>Male</sex> 
       <address1>103 Aiken Street</address1> 
       <address2></address2> 
       <city>Chichester</city> 
       <county>Sussex</county> 
       <postcode>PO19 4DS</postcode> 
       <telephone>01905149894</telephone> 
       <mobile>07784467941</mobile> 
       <email>[email protected]</email> 
      </personal> 
      <account> 
       <username>AmbientExpert</username> 
       <password>8e64214160e9dd14ae2a6d9f700004a6</password> 
       <userlevel>2</userlevel> 
       <signupdate>2010-03-26T09:23:50</signupdate> 
      </account> 
     </user> 
     <volunteer id="2"> 
      <roles>Van Driver,gas Fitter</roles> 
      <region>South Central</region> 
     </volunteer> 
    </member> 
</folktask> 
+0

Хороший вопрос (+1). См. Мой ответ для единственного правильного решения (в данный момент) - и это просто :) –

+0

@AdRock: В ответ на ваш комментарий, что исправление не приводит к результатам, которые я описал, я представил теперь в своем ответе полный результат преобразования. Вы можете видеть, что вся информация пользователя находится на выходе. –

+0

@AdRock: Я поместил весь текст исправленной трансформации в свой ответ.Просто запустите его на предоставленном XML, и вы должны получить тот же результат, что и в моем ответе. –

ответ

3

Проблема в этом коде:

<xsl:for-each select="folktask/member/user"> 

     <div class="userdiv"> 

      <xsl:apply-templates/> 

     </div> 
    </xsl:for-each> 

Это относится шаблоны для всех детей текущего user элемента - не к user элемента.

В результате шаблон, соответствующий user, не выбран.

Дети user: personal и account.

Шаблоны, соответствующие этим элементам, выбираются и производят их выходные данные.

Решение: Довольно некоторые очистки необходимо, но первый очевидный шаг, чтобы заменить приведенный выше код с:

 <xsl:apply-templates select="folktask/member/user"/> 

Вы также должны переместить div от удаляемого тела <xsl:for-each> в шаблон соответствует folktask/member/user.

Исправленный код XSLT является:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template name="hoo" match="/"> 
     <html> 
      <head> 
       <title>Registered Members</title> 
       <link rel="stylesheet" type="text/css" href="user.css" /> 
      </head> 
      <body> 
       <h1>Registered Members</h1> 
       <xsl:apply-templates select="folktask/member/user"/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="folktask/member/user"> 
     <div class="userdiv"> 
      <xsl:apply-templates select="@id"/> 
      <xsl:apply-templates select="personal/name"/> 
      <xsl:apply-templates select="personal/address1"/> 
      <xsl:apply-templates select="personal/city"/> 
      <xsl:apply-templates select="personal/county"/> 
      <xsl:apply-templates select="personal/postcode"/> 
      <xsl:apply-templates select="personal/telephone"/> 
      <xsl:apply-templates select="personal/mobile"/> 
      <xsl:apply-templates select="personal/email"/> 
      <xsl:apply-templates select="personal"/> 
      <xsl:apply-templates select="account/username"/> 
      <xsl:apply-templates select="account"/> 
     </div> 
    </xsl:template> 

    <xsl:template match="@id"> 
     <div class="heading bold"><h2>USER ID: <xsl:value-of select="." /></h2></div> 
    </xsl:template> 

    <xsl:template match="personal/name"> 
     <div class="small bold">NAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/address1"> 
     <div class="small bold">ADDRESS:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/city"> 
     <div class="small bold">CITY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/county"> 
     <div class="small bold">COUNTY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/postcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/telephone"> 
     <div class="small bold">TELEPHONE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/mobile"> 
     <div class="small bold">MOBILE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal/email"> 
     <div class="small bold">EMAIL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:text>mailto:</xsl:text> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal"> 
    <div class="small bold">SEX:</div> 
    <div class="colored bold"> 
     <xsl:choose> 
      <xsl:when test="sex='Male'"> 
       <div class="sex male"><xsl:value-of select="sex/."/></div> 
      </xsl:when> 
      <xsl:otherwise> 
       <div class="sex female"><xsl:value-of select="sex/."/></div> 
      </xsl:otherwise> 
     </xsl:choose> 
    </div> 
    </xsl:template> 

    <xsl:template match="account/username"> 
     <div class="small bold">USERNAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 


    <xsl:template match="account"> 
     <div class="small bold">ACCOUNT TYPE:</div> 
     <div class="colored "> 
     <xsl:choose> 
      <xsl:when test="userlevel='1'"> 
       <div class="nml bold">Normal User</div> 
      </xsl:when> 

      <xsl:when test="userlevel='2'"> 
       <div class="vol bold">Volunteer</div> 
      </xsl:when> 

      <xsl:when test="userlevel='3'"> 
       <div class="org bold">Organiser</div> 
      </xsl:when> 

      <xsl:otherwise> 
       <div class="name adm bold">Administrator</div> 
      </xsl:otherwise> 
     </xsl:choose> 
     </div> 
    </xsl:template> 

</xsl:stylesheet> 

Запуск исправленного преобразование теперь производит желаемых результатов:

<html> 
<head> 
<META http-equiv="Content-Type" content="text/html; charset=UTF-16"> 
<title>Registered Members</title> 
<link rel="stylesheet" type="text/css" href="user.css"> 
</head> 
<body> 
<h1>Registered Members</h1> 
<div class="userdiv"> 
<div class="heading bold"><h2>USER ID: 1</h2></div> 
<div class="small bold">NAME:</div> 
<div class="large">Abbie Hunt</div> 
<div class="small bold">ADDRESS:</div> 
<div class="large">108 Access Road</div> 
<div class="small bold">CITY:</div> 
<div class="large">Wells</div> 
<div class="small bold">COUNTY:</div> 
<div class="large">Somerset</div> 
<div class="small bold">POSTCODE:</div> 
<div class="large">BA5 8GH</div> 
<div class="small bold">TELEPHONE:</div> 
<div class="large">01528927616</div> 
<div class="small bold">MOBILE:</div> 
<div class="large">07085252492</div> 
<div class="small bold">EMAIL:</div> 
<div class="large"><a href="mailto:[email protected]">[email protected]</a></div> 
<div class="small bold">SEX:</div> 
<div class="colored bold"> 
<div class="sex female">Female</div> 
</div> 
<div class="small bold">USERNAME:</div> 
<div class="large">AdRock</div> 
<div class="small bold">ACCOUNT TYPE:</div> 
<div class="colored "> 
<div class="name adm bold">Administrator</div> 
</div> 
</div> 
<div class="userdiv"> 
<div class="heading bold"><h2>USER ID: 2</h2></div> 
<div class="small bold">NAME:</div> 
<div class="large">Aidan Harris</div> 
<div class="small bold">ADDRESS:</div> 
<div class="large">103 Aiken Street</div> 
<div class="small bold">CITY:</div> 
<div class="large">Chichester</div> 
<div class="small bold">COUNTY:</div> 
<div class="large">Sussex</div> 
<div class="small bold">POSTCODE:</div> 
<div class="large">PO19 4DS</div> 
<div class="small bold">TELEPHONE:</div> 
<div class="large">01905149894</div> 
<div class="small bold">MOBILE:</div> 
<div class="large">07784467941</div> 
<div class="small bold">EMAIL:</div> 
<div class="large"><a href="mailto:[email protected]">[email protected]</a></div> 
<div class="small bold">SEX:</div> 
<div class="colored bold"> 
<div class="sex male">Male</div> 
</div> 
<div class="small bold">USERNAME:</div> 
<div class="large">AmbientExpert</div> 
<div class="small bold">ACCOUNT TYPE:</div> 
<div class="colored "> 
<div class="vol bold">Volunteer</div> 
</div> 
</div> 
</body> 
</html> 
+0

Какая у вас другая очистка. Я попробовал ваше предложение, но я не получаю никаких данных, просто пустые divs, которые должны содержать данные. – AdRock

+0

@AdRock: я дал полный результат преобразования. Вы можете видеть, что вся информация пользователя находится на выходе. –

+0

Я полностью потерян. Это работало раньше с идентификатором пользователя, и я понимаю, что вы имеете в виду, когда идентификатор uer не является дочерним элементом, но теперь я смущен тому, что происходит. Я оставляю шаблон-шаблон там, где он есть, и перемещаю его для каждого внутри шаблона, соответствующего folktask/member/user. Это, вероятно, так очевидно, но я не вижу его. – AdRock

-2

Есть много ошибок. Основной являются следующие:

  • Вы не можете использовать шаблон для атрибута
  • Если вы пишете <xsl:apply-templates select="personal/name"/>, вы можете написать <xsl:template match="name">, чтобы соответствовать этому. (А также для других узлов)
+0

Нет абсолютно никакой причины, по которой вы не можете использовать шаблон apply-templates для атрибута. На самом деле встроенные шаблоны делают именно это. Я согласен с тем, что в этом случае «личный/имя» и т. Д. Чрезмерны, но часто существуют очень веские причины для использования более длинных путей. –

+0

Я действительно не знал, что применяемые шаблоны могут использоваться с атрибутами. Спасибо за новую информацию. Но я до сих пор не вижу смысла в этом. И о более длинном пути - я имел в виду текущую ситуацию, не все. – darja

 Смежные вопросы

  • Нет связанных вопросов^_^