2015-06-17 3 views
0

Я пытаюсь обходным путем для потери пользовательского XML в Word Office Office Open XML, и я столкнулся с некоторой проблемой.Tokenize для каждого символа в строке приводит к ошибке

Я работаю на пути отслеживания вкладов в хранилище общих планов уроков, которые будут проживать в месте Omeka. То, что я хочу сделать, - это обернуть каждого символа в закладку, которая затем будет скрыта от представления, когда файл будет открыт в Word. Это значит, что токен будет переноситься, когда все будет скопировано и вставлено за пределы сайта, а затем снова подключено к исходному вкладчику, когда новый файл будет загружен снова.

Чтобы сделать это, мой XML ток выглядит следующим образом:

<w:p w:rsidR="00196751" w:rsidRDefault="00956712"> 
    <w:r> 
     <w:t>Some sample text.</w:t> 
    </w:r> 
    <w:bookmarkStart w:id="0" w:name="_GoBack"/> 
    <w:bookmarkEnd w:id="0"/> 
</w:p> 

Что мне нужно сделать, это выглядит следующим образом:

<w:p w:rsidR="00196751" w:rsidRDefault="00956712"> 
      <w:bookmarkStart w:id="0" w:name="_NAME_0001_20150616_1"/> 
      <w:r> 
       <w:t>S</w:t> 
      </w:r> 
      <w:bookmarkStart w:id="1" w:name="_NAME_0001_20150616_2"/> 
      <w:bookmarkEnd w:id="0"/> 
      <w:r> 
       <w:t>o</w:t> 
      </w:r> 
      <w:bookmarkStart w:id="2" w:name="_NAME_0001_20150616_3"/> 
      <w:bookmarkEnd w:id="1"/> 
      <w:r> 
       <w:t>m</w:t> 
      </w:r> 
      <w:bookmarkStart w:id="3" w:name="_NAME_0001_20150616_4"/> 
      <w:bookmarkEnd w:id="2"/> 
      <w:r> 
       <w:t>e</w:t> 
      </w:r> 
      <w:bookmarkStart w:id="4" w:name="_NAME_0001_20150616_5"/> 
      <w:bookmarkEnd w:id="3"/> 
      <w:r> 
       <w:t xml:space="preserve"> </w:t> 
      </w:r> 
[...] 
<w:bookmarkStart w:id="17" w:name="_GoBack"/> 
<w:bookmarkEnd w:id="16"/> 
<w:bookmarkEnd w:id="17"/> 
</w:p> 

Мне кажется, что то, что мне нужно сделать, это запустить функцию разметить на исходном ш: п т, так что я написал следующее XSLT в качестве первого шага:

<xsl:template match="w:t"> 
    <xsl:value-of select="tokenize(., '.??')"/> 
</xsl:template> 

Howev er, когда я делаю это, я получаю сообщение об ошибке. Мое предположение заключается в том, что это связано с тем, что для функции tokenize нет фактического шаблона, поскольку я прошу его разделить на каждый символ. Есть ли способ использовать функцию tokenize для этого? Если да, то как мне сделать это, чтобы получить нужный мне результат? Благодаря!

+0

Разве вам не приходило, что нам может понравиться знать, что такое сообщение об ошибке? –

ответ

1

Вы должны иметь шаблон для этого, который можно применить к исходному <w:t> значения:

<xsl:template name="tokenize"> 
    <xsl:param name="text"/> 
    <xsl:choose> 
     <xsl:when test="string-length($text) = 1"> 
      <w:r> 
       <w:t><xsl:value-of select="$text"/></w:t> 
      </w:r> 
     </xsl:when> 
     <xsl:otherwise>    
      <w:r> 
       <w:t><xsl:value-of select="substring($text, 1, 1)"/></w:t> 
      </w:r> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring($text, 2, string-length($text)-1)"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

не уверен, как вес: bookmarkStart и вес: bookmarkEnd логики работы, но вы, вероятно, можете понять это из этого.

0

Есть две ошибки, которые я могу себе представить (это позор, который вы не думали сообщить нам сообщение об ошибке). Во-первых, функция токенизации недоступна, что означает, что вы используете процессор XSLT 1.0; другое - ваше регулярное выражение недействительно.

Если вы используете процессор XSLT 2.0, вы можете разделить строку на символы, используя string-to-codeepoints() (и вы можете повернуть каждый символ обратно в строку с помощью codepoints-to-string()).

Если вы используете процессор XSLT 1.0, то вам необходимо сделать разделение «вручную» с использованием рекурсивного шаблона как предложено @yarivt.

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