Как я могу изменить XSL, чтобы изменить формат XML - PullRequest
0 голосов
/ 23 апреля 2010

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

<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 Ответ

1 голос
/ 23 апреля 2010

Чтобы это произошло, вам нужна какая-то рекурсия (для вложения 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>
...