2013-03-07 4 views
0

У меня есть XML, как это -Как пройти после выключения-выход-побег

<DOCUMENT> 
<SERVICE> 
<ID>1338</ID> 
<NAME> 
&lt;EN&gt;this is an english name&lt;/EN&gt; 
&lt;DE&gt;this is a german name&lt;/DE&gt; 
</NAME> 
</SERVICE> 
</DOCUMENT> 

Как вы можете видеть элементы внутри имя тега XML, как, но на самом деле не отформатирован в качестве элементов. Выходной XML должен выглядеть так:

<SERVICES> 
<SERVICE ID="1338" EN="this is an english name" DE="this is a german name"/> 
</SERVICES> 

Я пытаюсь получить значение EN и DE через XPATH. Я попытался воспроизвести с отключением-выходом-экранированием, но я не думаю, что это сработает.

<xsl:template match="/"> 
<SERVICES> 
<SERVICE> 
<xsl:attribute name="ID"><xsl:value-of select="DOCUMENT/SERVICE/ID"/></xsl:attribute> 
<xsl:attribute name="EN"><xsl:value-of select="DOCUMENT/SERVICE/NAME/EN" disable-output-escaping="yes"/></xsl:attribute> 
<xsl:attribute name="DE"><xsl:value-of select="DOCUMENT/SERVICE/NAME/DE" disable-output-escaping="yes"/></xsl:attribute> 
</SERVICE> 
</SERVICES> 
</xsl:template> 

Любые предложения здесь?

+0

Как вы думаете, подстрока() может быть применена здесь или ваш источник будет слишком динамичным? Вы еще не пробовали выход? – JWiley

+0

Какой XSLT-процессор вы используете? Имеет ли он функцию расширения, такую ​​как Saxon 9, например, с http://www.saxonica.com/documentation/functions/intro/parse-xml.xml? –

+0

У меня нет расширения, такого как Saxon9 .. его простой встроенный сервер преобразования в нашей поисковой системе. – user1766784

ответ

0

Предпочтительный подход заключается в содержание строкового элемента NAME и поставить его через XML-парсер, чтобы превратить его в дерево узлов. Это можно сделать, если ваш процессор поддерживает расширение, такое как saxon: parse() (или XPath 3.0 parse-xml()), или путем вызова функции расширения.

Если внутренний XML очень стереотипный и предсказуемый, тогда вы можете проанализировать его с помощью прямой манипуляции с строкой.

0

Если вы используете XSLT 2.0, воспользуйтесь некоторыми из своих функций синтаксического анализа. Вы можете использовать analyze-string, чтобы вытащить нужные данные.

Ниже должно быть полное рабочее преобразование.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="/"> 
     <DOCUMENT> 
      <SERVICES> 
       <xsl:for-each select="DOCUMENT/SERVICE"> 
        <SERVICE> 
         <xsl:attribute name="ID"><xsl:value-of select="ID"/></xsl:attribute> 
         <xsl:analyze-string select="NAME" regex="&lt;(.*?)&gt;(.*?)&lt;/\1&gt;"> 
          <xsl:matching-substring> 
           <xsl:attribute name="{regex-group(1)}" select="regex-group(2)"/> 
          </xsl:matching-substring> 
         </xsl:analyze-string> 
        </SERVICE> 
       </xsl:for-each> 
      </SERVICES> 
     </DOCUMENT> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо. Но я использую XSLT 1.0, поэтому этот ответ не поможет мне слишком сильно, я боюсь. – user1766784