Как скопировать элемент на все элементы, присутствующие в группе, используя XSLT - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть Input xml, используя приведенное ниже XSL-преобразование. Я могу добавить deptId как дочерний элемент к элементу Employees, но я хочу добавить его как дочерний элемент к каждому элементу employee. Я новв XSLT Я попробовал приведенное ниже преобразование, но не получил требуемый вывод

Входной XML:

<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
    <companyName>ABC</companyName>
    <deptId>12</deptId>
    <employee>
       <name>n1</name>
       <empid>e1</empid>
    </employee>
    <employee>
       <name>n2</name>
       <empid>e2</empid>
    </employee>
    <employee>
       <name>n3</name>
       <empid>e3</empid>
    </employee>
</rootnode>

XSL-преобразование:

<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:template match="/rootnode">
 <xsl:copy>
    <xsl:copy-of select="companyName"/>
     <xsl:copy-of select="deptId"/>

    <employees>
        <xsl:copy-of select="employee"/>
        <xsl:copy-of select="deptId"/>
    </employees>
  </xsl:copy>
 </xsl:template>

</xsl:stylesheet>

Выходной XML:

<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
    <companyName>ABC</companyName>
    <deptId>D1</deptId>
    <employees>
        <employee>
            <name>n1</name>
            <empid>e1</empid>
        </employee>
        <employee>
            <name>n2</name>
            <empid>e2</empid>
        </employee>
        <employee>
            <name>n3</name>
            <empid>e3</empid>
        </employee>
       <deptId>D1</deptId>
   </employees>
 </rootnode>

Требуемый результат:

<?xml version="1.0" encoding="UTF-8"?>
 <rootnode>
      <companyName>ABC</companyName>
      <deptId>12</deptId>
      <employees>
          <employee>
             <name>n1</name>
             <empid>e1</empid>
             <deptId>12</deptId>
          </employee>
          <employee>
             <name>n2</name>
             <empid>e2</empid>
             <deptId>12</deptId>
          </employee>
          <employee>
             <name>n3</name>
             <empid>e3</empid>
             <deptId>12</deptId>
          </employee>
     </employees>
</rootnode>   

Я хочу, чтобы deptId был скопирован во все элементы 'employee' в элементе 'employee', может кто-нибудь помочь мне в этом.

1 Ответ

0 голосов
/ 20 декабря 2018

В вашем совпадении с шаблоном rootnode вы можете выполнить:

<xsl:template match="rootnode">
    <xsl:copy>
        <xsl:copy-of select="node()[not(self::employee)]"/>
        <employees>
            <xsl:apply-templates select="employee"/>
        </employees>
    </xsl:copy>
</xsl:template>

, то есть скопировать корневой узел, скопировать все дочерние узлы, кроме employee.Затем поместите все employee узлы в employees

Затем, в вашем employee сопоставлении с шаблоном, вы можете сделать:

<xsl:template match="employee">
    <xsl:copy>
        <xsl:copy-of select="node()"/>
        <xsl:copy-of select="preceding-sibling::deptId"/>
    </xsl:copy>
</xsl:template>

, то есть скопировать узел и его дочерние элементы,и скопируйте предшествующего брата deptId.

Вся таблица стилей ниже

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>    

    <xsl:template match="rootnode">
        <xsl:copy>
            <xsl:copy-of select="node()[not(self::employee)]"/>
            <employees>
                <xsl:apply-templates select="employee"/>
            </employees>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="employee">
        <xsl:copy>
            <xsl:copy-of select="node()"/>
            <xsl:copy-of select="preceding-sibling::deptId"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

См. это в действии https://xsltfiddle.liberty -development.net / bFDb2Dq .

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