2013-11-20 4 views
2

У меня есть ниже фрагмент XMLвызов другой шаблон в Regex

<title>Conduct of external affairs <content-style font-style="italic">via</content-style> NGOs</title> 

здесь, когда я пытаюсь сопрягать с Regex он бросает мне ошибку

Шаблон я использую это

<?xml version='1.0'?> 
<xslt:stylesheet version="2.0" xmlns:xslt="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:param name="Conjunction">(of)|(to)|(and)|(the)</xsl:param> 

    <xsl:template match="title"> 
    <xsl:call-template name="changeUpperCase"> 
     <xsl:with-param name="Text" select="text()"/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="changeUpperCase"> 
    <xsl:param name="Text"/> 
    <xsl:value-of select="for $EachToken in tokenize(lower-case($Text), ' ') 
          return 
          if(matches($EachToken, $Conjunction)) 
          then 
          $EachToken 
          else 
          concat(upper-case(substring($EachToken, 1, 1)), substring($EachToken, 2))"/> 

    </xsl:template> 

</xslt:stylesheet> 

ошибка я получаю это

XSLT 2.0 Debugging Error: Error: file:///C:/Users/u0138039/Desktop/Proview/HK/The%20Law%20of%20the%20Hong%20Kong%20Constitution/The%20Law%20of%20the%20Hong%20Kong%20Constitution/XSLT/Chapters.xsl:39: Wrong occurrence to match required sequence type - Details: -  XPTY0004: The supplied sequence ('2' item(s)) has the wrong occurrence to match the sequence type xs:string ('zero or one') 

Я также объявил шаблон для контента, но я не могу узнать, как его связать.

<xsl:template match="content-style"> 
<xsl:choose> 
    <xsl:when test="./@format"> 
     <span class="{concat('format-',@format)}"> 
       <xsl:apply-templates/> 
     </span> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:variable name="fontStyle"> 
      <xsl:value-of select="concat('font-style-',@font-style)"/> 
     </xsl:variable> 
     <span class="{$fontStyle}"> 
      <xsl:value-of select="."/> 
      <xsl:apply-templates select="para"/> 
     </span> 
    </xsl:otherwise> 
</xsl:choose>  
    </xsl:template> 

но выше шаблон работает, если я использую ниже XML-фрагмент кода

<title>IS HONG KONG AN INTERNATIONAL PERSON?</title> 

Случай 2:

<title>PREPARATION FOR TRANSFER OF SOVEREIGNTY</title> 

это должно быть преобразовано в

Preperation for Transfer of Sovereignty 

, пожалуйста, дайте мне знать, как я могу solv e этот вопрос.

Благодаря

ответ

1

Я хотел бы предложить использовать единый стиль кода с соответствующими шаблонами вместо называемых шаблонов:

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

    <xsl:param name="Conjunction">(of)|(to)|(and)|(the)|(for)</xsl:param> 

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

    <xsl:template match="title/text()"> 
    <xsl:value-of select="for $EachToken in tokenize(lower-case(.), ' ') 
          return 
          if(matches($EachToken, $Conjunction)) 
          then 
          $EachToken 
          else 
          concat(upper-case(substring($EachToken, 1, 1)), substring($EachToken, 2))"/> 

    </xsl:template> 

    <xsl:template match="content-style"> 
    <xsl:variable name="fontStyle" select="concat('font-style-',@font-style)"/> 
     <span class="{$fontStyle}"> 
      <xsl:value-of select="."/> 
      <xsl:apply-templates select="para"/> 
     </span> 
    </xsl:template> 

    <xsl:template match="content-style[@format]"> 
     <span class="{concat('format-',@format)}"> 
       <xsl:apply-templates/> 
     </span> 
    </xsl:template> 

</xsl:stylesheet> 

Таким образом, ошибка просто исчезает, как теперь есть шаблон для text ребенка узлы ваших title элементов, обработанных apply-templates.

В текущем коде with-param name="Text" select="text()" вы передаете последовательность text дочерних узлов в шаблон, если элемент имеет смешанное содержимое и этак lower-case вызова имеет неправильный тип аргументов.

Теперь необходимо применять шаблоны для элементов content-style, но я не уверен, что они будут делать именно то, что вы хотите, поскольку вы не указали это подробно. Опубликуйте новый вопрос, если есть еще проблемы с этой второй частью вашего вопроса.

Исходя из ваших комментариев, которые я пересмотрел таблицу стилей использовать analyze-string:

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

    <xsl:param name="Conjunction">^(of|to|and|the|for)$</xsl:param> 

    <xsl:template match="title"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="title/text()"> 
    <xsl:analyze-string select="." regex="(\w)(\w*)"> 
     <xsl:matching-substring> 
     <xsl:value-of 
      select="if (matches(., $Conjunction, 'i')) 
        then lower-case(.) 
        else concat(upper-case(regex-group(1)), lower-case(regex-group(2)))"/> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
    </xsl:template> 

    <xsl:template match="content-style"> 
    <xsl:variable name="fontStyle" select="concat('font-style-',@font-style)"/> 
     <span class="{$fontStyle}"> 
      <xsl:apply-templates/> 
     </span> 
    </xsl:template> 

    <xsl:template match="content-style[@format]"> 
     <span class="{concat('format-',@format)}"> 
       <xsl:apply-templates/> 
     </span> 
    </xsl:template> 

</xsl:stylesheet> 

Теперь Saxon 9,5 трансформирует

<root> 
    <title>HOW HIGH IS THE &#x201C;HIGH DEGREE OF AUTONOMY&#x2019; OF HONG KONG?</title> 
    <title>PREPARATION FOR TRANSFER OF SOVEREIGNTY</title> 
    <title>Conduct of external affairs <content-style font-style="italic">via</content-style> NGOs</title> 
</root> 

в

<title>How High Is the “High Degree of Autonomy’ of Hong Kong?</title> 
    <title>Preparation for Transfer of Sovereignty</title> 
    <title>Conduct of External Affairs <span class="font-style-italic">via</span> Ngos</title> 
+0

Привет @Martin это работает как шарм. Большое спасибо. Но мне нужно маленькое tweek в шаблоне, который вы указали выше, мне нужно увидеть, что первая буква - это кепки, если это не то, что я должен использовать ее заглавными. Еще раз спасибо, пожалуйста, посмотрите мой вопрос 2. – user2423959

+0

Я думаю, что код, который мы в настоящее время преобразуем «Подготовка к передаче суверенитета» в «Подготовка к передаче суверенитета», поэтому 't'' передачи' преобразуется в 'T'. Что еще не хватает? –

+0

Прошу прощения за неправильный ввод, я обновил его сейчас, на самом деле мне нужно преобразовать «ПОДГОТОВКУ ДЛЯ ПЕРЕДАЧИ СУБЪЕКТРОВАНИЯ» в «Препарат для передачи суверенитета», но теперь он преобразуется как «Подготовка к передаче суверенитета» и также «КАК ВЫСОКАЯ - & # x201C; ВЫСОКАЯ СТЕПЕНЬ АВТОНОМИИ & # x2019; OF HONG KONG? 'Неправильно преобразуется. – user2423959

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