Динамически впитывать значения дочерних элементов в текст одного из родителей - PullRequest
1 голос
/ 23 февраля 2020

У меня небольшие проблемы с тем, как написать динамическую c часть XSLT, которая должна происходить с C элементами. Все значения элемента C должны быть объединены в один текст и разделены дополнительными текстовыми вставками, такими как «имя-1, имя-2» и т. Д. c (в зависимости от количества C -брат).

источник

<root>
<A a-attr="01"> 
    <B b-attr1="b-value" b-attr2="b-value">
        <C> aaaa </C> 
        <C> bbbb </C> 
        <C> cccc </C>
    </B>        
</A>
</root>

желаемый вывод

<A a-attr="01" b-attr1="b-value" b-attr2="b-value" c-text-absorbation="name-1: aaaa, name-2: bbbb, name-3: cccc"/>

мой XSLT (работает неправильно с Элементы "C") https://xsltfiddle.liberty-development.net/ncnu9Bv/1

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
      <xsl:template match="A">
        <A>
          <xsl:copy-of select="@*"/>
          <xsl:copy-of select="@*|B/@*"/>
          <xsl:copy-of select="//A/B/C"/>
        </A>
      </xsl:template>
    </xsl:stylesheet>

Как улучшить существующий XSLT в соответствии с желаемой моделью?

1 Ответ

1 голос
/ 23 февраля 2020

Как насчет:

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="*"/>

<xsl:template match="A">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="B/@*"/>
        <xsl:attribute name="c-text-absorbation">
            <xsl:for-each select="B/C">
                <xsl:text>name-</xsl:text>
                <xsl:value-of select="position()"/>
                <xsl:text>: </xsl:text>
                <xsl:value-of select="."/>
                <xsl:if test="position() &lt; last()">
                    <xsl:text>, </xsl:text>
                </xsl:if>
            </xsl:for-each>
        </xsl:attribute>
    </xsl:copy>
</xsl:template>

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