2010-04-23 2 views
0

В приведенном ниже XSL каждый раз, когда xsl: когда он удовлетворен, я хочу добавить столько меток <a> и </a>. Но данные, которые должны быть заполнены внутри тегов, должны быть только один раз. Я показал ожидаемый результат в конце. Как изменить XSL для изменения формата xml

<xsl:param name="insert-file" as="document-node()" /> 
<xsl:template match="*"> 
<xsl:variable name="input">My text</xsl:variable> 
<xsl:variable name="Myxml" as="element()*"> 
    <xsl:call-template name="populateTag"> 
      <xsl:with-param name="nodeValue" select="$input"/> 
    </xsl:call-template> 
</xsl:variable> 
<xsl:copy-of select="$Myxml"></xsl:copy-of> 
</xsl:template> 

<xsl:template name="populateTag"> 
    <xsl:param name="nodeValue"/> 
    <xsl:for-each select="$insert-file/insert-data/data"> 
     <xsl:choose> 
      <xsl:when test="@index = 1"> 
       <a><xsl:value-of select="$nodeValue"></xsl:value-of></a> 
      </xsl:when>    
     </xsl:choose> 
    </xsl:for-each> 
</xsl:template>  

Токовый выход:

<?xml version="1.0" encoding="UTF-8"?> <a> Мой текст </a> <a> Мой текст </a> <a> Мой текст </a> <a> Мой текст </a>

Я хотите, чтобы шаблон «populateTag» возвращал мне xml в следующем формате. Как изменить шаблон «populateTag», чтобы добиться того же.

Ожидаемый результат от шаблона "populateTag": <?xml version="1.0" encoding="UTF-8"?> <a><a><a><a> Мой текст </a></a></a></a>

Пожалуйста, дайте свои идеи.

ответ

1

Для этого вам потребуется какая-то рекурсия (для гнезда a-элементов).

Не пытаясь, потому что я не имею образец XML-документ:

<xsl:param name="insert-file" as="document-node()" /> 
<xsl:template match="*"> 
<xsl:variable name="input">My text</xsl:variable> 
<xsl:variable name="Myxml" as="element()*"> 
    <xsl:call-template name="populateTag"> 
      <xsl:with-param name="nodeValue" select="$input"/> 
      <xsl:with-param name="position" select="1"/> 
    </xsl:call-template> 
</xsl:variable> 
<xsl:copy-of select="$Myxml"></xsl:copy-of> 
</xsl:template> 

<xsl:template name="populateTag"> 
    <xsl:param name="nodeValue"/> 
    <xsl:param name="position"/> 
    <xsl:variable name="total" select="count($insert-file/insert-data/data[@index = 1])" /> 
    <xsl:for-each select="$insert-file/insert-data/data[@index = 1]"> 
     <xsl:if test="position() = $position" > 
      <xsl:choose> 
       <xsl:when test="position() = $total"> 
        <a><xsl:value-of select="$nodeValue"></xsl:value-of></a> 
       </xsl:when>    
       <xsl:otherwise> 
       <a>  
         <xsl:call-template name="populateTag"> 
           <xsl:with-param name="nodeValue" select="$input"/> 
           <xsl:with-param name="position" select="$position+1"/> 
         </xsl:call-template> 
       </a> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
+0

Спасибо за ваш ответ. Оно работает. – user323719

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