2016-07-12 3 views
1

Я хочу обрезать дополнительные пробелы из текстовых значений моего XML. Я пробовал различные варианты через Интернет, но никто из них не работал на меня. Я не могу использовать normalize-space(), потому что мне нужно удалить только ведущие & трейлинг-пространства.XSLT для удаления пробелов из текстовых узлов

XML:

<BillEvent> 
<TransactionInfo> 
    <EventDate> 2016-04-13T05:40:28 </EventDate> 
    </TransactionInfo> 
     <CaseID> Since  this is a CDATA section! </CaseID> 
     <BillGroup> 
       <Bill> 
       <BillNumber>  253545666847</BillNumber> 
       <ToDate> 2016-05-31  </ToDate> 
       <BillActivityCode tc="1"/> 
       <BillCreationDate>  Since this is a CDATA section! </BillCreationDate> 
      </Bill> 
     </BillGroup>  
</BillEvent> 

Ожидаемые результаты:

<BillEvent> 
<TransactionInfo> 
    <EventDate>2016-04-13T05:40:28</EventDate> 
    </TransactionInfo> 
     <CaseID>Since  this is a CDATA section!</CaseID> 
     <BillGroup> 
       <Bill> 
       <BillNumber>253545666847</BillNumber> 
       <ToDate>2016-05-31</ToDate> 
       <BillActivityCode tc="1"/> 
       <BillCreationDate>Since this is a CDATA section!</BillCreationDate> 
      </Bill> 
     </BillGroup>  
</BillEvent>   

т.е. только ведущие & конечные пробелы должны быть удалены.

XSLT используется:

<xsl:stylesheet version ="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" method ="xml" indent = "yes" cdata-section-elements="BillCreationDate"/> 

<xsl:template match="node()|@*"> 
<xsl:copy> 
<xsl:apply-templates select="node()|@*"/> 
</xsl:copy> 
</xsl:template> 

<xsl:template match="text()"> 
<xsl:copy> 
<xsl:sequence-of select="replace(., '^\s+|\s+$', '')"/> 
</xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Я также попытался translate(.,' &#x9;&#xa;&#xd;', '') & replace(.,'^ +',''). Я не уверен, что не так с моим кодом, из-за которого никто из них не работал. Буду признателен за любую помощь по этому вопросу.

ответ

1

Ваше правильное выражение в replace является правильным. Проблема в том, что у вас в вашем шаблоне есть xsl:copy, который копирует текст как есть, и тогда нет смысла пытаться добавить что-то в качестве дочернего элемента текстового узла.

Кроме того, xsl:sequence-of не является допустимой командой (хотя это может быть опечатка в вашем вопросе).

Попробуйте этот шаблон ...

<xsl:template match="text()"> 
    <xsl:value-of select="replace(., '^\s+|\s+$', '')"/> 
</xsl:template> 
+0

Большое спасибо за ваш ответ. На самом деле я пытался это сделать на инструменте, доступном в Интернете, который выдавал ошибку - 'Недействительно. FatalError: javax.xml.transform.TransformerException: Не удалось найти функцию: заменить FatalError: javax.xml.transform.TransformerException: токен функции не найден. FatalError: javax.xml.transform.TransformerException: java.lang.NullPointerException', поэтому я изменил его на ** xsl: sequence-of ** & Я добавил копию, потому что она не печатала никакого текстового значения вообще. В любом случае, мое плохое. Попробовал свой код в другом инструменте, где он работал, как ожидалось. Благодарю. :) –

+0

'replace' работает только в XSLT 2.0, поэтому первый инструмент, который вы пробовали, вероятно, поддерживал только XSLT 1.0. –

+0

Да, может быть, с этого момента я проверю все эти детали, прежде чем пытаться. –

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