Как использовать приращение переменной и объединить его с каждым дочерним узлом с помощью xslt - PullRequest
2 голосов
/ 02 мая 2019

Мне нужна помощь с кодом XSLT, который я пытаюсь создать. Приведенный ниже XML-код имеет несколько дочерних узлов, которые мне нужно преобразовать в объединенное значение 'variable' _ (значение имени файла). Мой образец XML ниже,

<Attachments>
    <AttachFile>
        <FilContentType>application/pdf; name=docxyz1.pdf</FilContentType>
        <FileName>docxyz1.pdf</FileName>
    </AttachFile>
    <AttachFile>
        <FilContentType>application/pdf;name=docxyz2.pdf</FilContentType>
        <FileName>docxyz2.pdf</FileName>
    </AttachFile>
    <AttachFile>
        <FilContentType>application/pdf; name=docxyz3.pdf</FilContentType>
        <FileName>docxyz3.pdf.pdf</FileName>
    </AttachFile>
</Attachments>

Преобразованный выходной сигнал должен быть таким, как показано ниже

<Attachments>
    <AttachFile>
        <FilContentType>application/pdf; name=docxyz1.pdf</FilContentType>
        <FileName>1_docxyz1.pdf</FileName>
    </AttachFile>
    <AttachFile>
        <FilContentType>application/pdf;name=docxyz2.pdf</FilContentType>
        <FileName>2_docxyz2.pdf</FileName>
    </AttachFile>
    <AttachFile>
        <FilContentType>application/pdf; name=docxyz3.pdf</FilContentType>
        <FileName>3_docxyz3.pdf.pdf</FileName>
    </AttachFile>
</Attachments>

Я пытался вызвать шаблон и использовать for-each, но моя логика неверна. Мой код XSLT ниже:

 <xsl:variable name="Count" select="count(/Attachments/AttachFile/FileName)"/>
<xsl:variable name="i" select="1"></xsl:variable>


<xsl:template match="/">
        <xsl:apply-templates select="Attachments"/>
</xsl:template>


<xsl:template match="Attachments">
    <Attachments>
        <xsl:for-each select="./Attachments/AttachFile">
            <AttachFile>
                <FilContentType><xsl:value-of select="FilContentType"/></FilContentType>

            <xsl:call-template name="Increment">
                <xsl:with-param name="i" select="1"/>
                <xsl:with-param name="Count" select="$Count"/>
            </xsl:call-template>
            </AttachFile>
            </xsl:for-each>
    </Attachments>
</xsl:template>

<xsl:template name="Increment">
    <xsl:param name="i"/>
    <xsl:param name="Count"/>
    <xsl:if test="$Count > $i">
        <Filename>
            <xsl:value-of select="concat($i,'_',FileName)"/> 
        </Filename>
        <xsl:call-template name="Increment">
            <xsl:with-param name="i" select="$i + 1"/>
            <xsl:with-param name="Count" select="$Count"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

Спасибо

1 Ответ

2 голосов
/ 02 мая 2019

Не может быть просто:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="FileName">
    <xsl:copy>
        <xsl:number count="AttachFile" format="1_"/>
        <xsl:value-of select="." />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Применительно к вашему примеру результат будет:

Результат

<?xml version="1.0" encoding="utf-16"?>
<Attachments>
  <AttachFile>
    <FilContentType>application/pdf; name=docxyz1.pdf</FilContentType>
    <FileName>1_docxyz1.pdf</FileName>
  </AttachFile>
  <AttachFile>
    <FilContentType>application/pdf;name=docxyz2.pdf</FilContentType>
    <FileName>2_docxyz2.pdf</FileName>
  </AttachFile>
  <AttachFile>
    <FilContentType>application/pdf; name=docxyz3.pdf</FilContentType>
    <FileName>3_docxyz3.pdf.pdf</FileName>
  </AttachFile>
</Attachments>

Демо : https://xsltfiddle.liberty -development.net / bFN1y9y

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...