2012-04-17 6 views
1

Из следующего xml я прочитал атрибут Version.Как анализировать значение атрибута с помощью xslt?

<BatchTable> 
    <UUThref 
    SocketIndex='0 - CCM' 
    UUTResult='Passed' 
    URL='C:\OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml' 
    FileName='OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml' 
    ECAFailCount='1' 
    Version='StationPartNumber=55555 StationSerialNumber=2222 TPSPartNumber=1234'/> 
</BatchTable> 

Значение в атрибуте Version является динамическим, и пользователь может добавить любую длину строк. Как я могу разделить значения и отобразить их в отдельных строках. Так что он показывает, как этот

StationPartNumber=55555 
StationSerialNumber=2222 
TPSPartNumber=1234 

В настоящее время на чтение значения версии отображается как:

StationPartNumber=55555 StationSerialNumber=2222 TPSPartNumber=1234 

Если какой-либо специальный символ должен быть добавлен между значениями, то я могу пользователь обеспечить его добавляется так, что расщепление может быть проще. В настоящее время добавляется «\ n» между конкатенацией, но xsl, кажется, выбирает значения и удаляет любые пробелы.

+0

http://stackoverflow.com/questions/584082/xslt-best-way-to-split-and-render-comma-separated-text-as-html вероятно, будет указывать вам в правильном направлении. –

+0

XSLT 1.0 или 2.0? –

ответ

0

DevNull задал ключевой вопрос здесь - некоторые вещи реально легко в XSLT 2.0, но требует много усилий в XSLT 1.0 - см ниже решение в XSLT 2.0, в сущности, что делает использование tokenize() несильно:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="UUThref"> 
     <root> 
      <xsl:variable name="test" select="tokenize(@Version, '\s+')"/> 
      <xsl:for-each select="$test"> 
       <w><xsl:value-of select="."/></w> 
      </xsl:for-each> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

дает

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <w>StationPartNumber=55555</w> 
    <w>StationSerialNumber=2222</w> 
    <w>TPSPartNumber=1234</w> 
</root> 

Пояснение: \s+ означает любого ненулевого числа последовательных пробелов (пробел, CR, LF или TAB).
Функция tokenize() создает набор узлов, состоящий из строк, возникающих в результате разделения текстового значения на основе предоставленного регулярного выражения.
Этот набор узлов может быть зациклен xsl:for-each.

0

Это довольно просто сделать в XSLT 1.0 (и может быть получен даже с одним выражением XPath):

Просто используйте:

translate(normalize-space(/*/*/@Version), ' ', '&#xA;') 

Вот полная трансформация - проще и короче, публикуемая XSLT 2.0 решения - нет xsl:variable, нет xsl:for-each:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="UUThref"> 
    <xsl:value-of select= 
    "translate(normalize-space(/*/*/@Version), ' ', '&#xA;')"/> 
</xsl:template> 
</xsl:stylesheet> 

когда это преобразование применяется на поставленном XML документа:

<BatchTable> 
    <UUThref 
     SocketIndex='0 - CCM' 
      UUTResult='Passed' 
      URL='C:\OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml' 
      FileName='OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml' 
      ECAFailCount='1' 
      Version='StationPartNumber=55555 StationSerialNumber=2222 TPSPartNumber=1234'/> 
</BatchTable> 

разыскиваемый, правильный результат получается:

StationPartNumber=55555 
StationSerialNumber=2222 
TPSPartNumber=1234 

Объяснение:

Надлежащее использование функций XPath normalize-space() и translate()

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