2013-11-13 3 views
2

Это должно быть просто, но я не могу это понять. У меня есть файлы XML, содержащие некоторые пустые узлы, которые я хочу заменить фиксированной строкой через XSL. Если узел содержит данные, которые он хорошо, но если он пуст, я хочу, чтобы заменить его в строку «18010101»XSL Замена пустого узла данными

Для примера:

До:

<?xml version="1.0"?> 
<TopNode> 
    <SubNode1> 
    <SubNode2> 
     <SubNode3> 
     <SubNode4> 
      <date_of_birth></date_of_birth> 
     </SubNode4> 
     </SubNode3> 
    </SubNode2> 
    </SubNode1> 
</TopNode> 

После:

<?xml version="1.0"?> 
<TopNode> 
    <SubNode1> 
    <SubNode2> 
     <SubNode3> 
     <SubNode4> 
      <date_of_birth>18010101</date_of_birth> 
     </SubNode4> 
     </SubNode3> 
    </SubNode2> 
    </SubNode1> 
</TopNode> 

У меня есть аналогичная проблема, когда я заменяю фиксированное значение другим фиксированным значением с помощью xsl.

<xsl:template match="transaction_type[text()='15']"> 
    <xsl:text>5</xsl:text> 
    </xsl:template> 

Он отлично работает, но когда я пытаюсь сделать аналогичное исправление для выпуска дата не похоже на работу.

<xsl:template match="date_of_birth"> 
    <xsl:if test="date_of_birth = ''"> 
     <xsl:text>18010101</xsl:text> 
    </xsl:if> 
    </xsl:template> 

Благодаря

+0

не забудьте принять ответы – Hash

ответ

3

Изменить ваш xsl:if на:

<xsl:if test=". = ''"> 

или изменить xsl:template match на:

<xsl:template match="date_of_birth[. = '']"> 
+0

я пытался это раньше. « 'не выполняет сопоставление, когда я отлаживаю вывод. '' соответствует – skynetsysadmin

+0

Похоже, что это работает. 18010101< xsl: value-of select = "text()" /> skynetsysadmin

+2

Другой пример того, почему почти всегда неправильно использовать text(): пустой элемент не имеет текстовых узлов , поэтому не может быть текстового узла, равного ''! Используйте 'match =" date_of_birth [. = ''] "' –

0

Я бы просто сделать это,

XML:

<?xml version="1.0"?> 
<TopNode> 
    <SubNode1> 
    <SubNode2> 
     <SubNode3> 
     <SubNode4> 
      <date_of_birth></date_of_birth> 
     </SubNode4> 
     </SubNode3> 
    </SubNode2> 
    </SubNode1> 
</TopNode> 

XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* , node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="date_of_birth"> 
     <xsl:if test=". = ''"> 
     <date_of_birth>18010101</date_of_birth> 
     </xsl:if> 
     <xsl:if test=". != ''"> 
     <date_of_birth> 
      <xsl:value-of select="text()" /> 
     </date_of_birth> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

<?xml version="1.0" encoding="UTF-8"?> 
<TopNode> 
    <SubNode1> 
     <SubNode2> 
     <SubNode3> 
      <SubNode4> 
       <date_of_birth>18010101</date_of_birth> 
      </SubNode4> 
     </SubNode3> 
     </SubNode2> 
    </SubNode1> 
</TopNode> 
Смежные вопросы