Применение XSLT рекурсивно - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать xml из другого xml, используя xslt.Но у меня есть проблема при попытке заставить его работать рекурсивноправда".Родители тоже должны быть найдены, даже если у них нет атрибута conf = "true" Что-то вроде:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <sites>
      <site name="name001" enabled="true" />
      <env name="name004" enabled="true" />
   </sites>
      <type name="test999" enabled="true">
         <props>
            <others>
               <other name="name001" enabled="true">WEBSITE1</other>
         </props>
      </type>
      <type name="www">
         <props>
            <otherProps>
               <otherProp name="pass" enabled="true" />
            </otherProps>
         </props>
      </type>
   </templates>
</root>

Заранее спасибо за вашу помощь.

1 Ответ

0 голосов
/ 19 октября 2018

Я почти уверен, что вы включили включенный атрибут, который должен быть истинным, чтобы вывести некоторые данные.По сути, вам нужно скопировать каждый элемент, имеющий этот атрибут, или потомка с этим атрибутом.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fx="this" exclude-result-prefixes="xs"
    version="1.0">
    <xsl:strip-space elements="*"/> <!-- Removes whitespaces in the output -->
    <xsl:template match="node()"> <!-- Matches every node and checks if it should be printed -->
        <xsl:if test="descendant-or-self::node()[@enabled='true']">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
    <xsl:template match="@*|text()"> <!-- We did the check in the node template already so we just want to copy everything -->
        <xsl:copy/>
    </xsl:template>
</xsl:stylesheet>

При вводе:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <sites>
      <site name="name001" enabled="true" />
      <site name="name003" enabled="false">456</site>
      <env name="name004" enabled="true" />
   </sites>
   <templates>
      <template name="example" SSL="true">
         <props>
            <others>
               <other name="abc001">true</other>
               <other name="abc002">
                  <options>
                     <option name="xyz001">567</option>
                     <option name="xyz001">987</option>
                  </options>
               </other>
            </others>
         </props>
      </template>
      <type name="test999" enabled="true">
         <props>
            <others>
               <other name="name001" enabled="true">WEBSITE1</other>
               <other name="abc001" />
            </others>
            <install name="xyz">example001</install>
         </props>
      </type>
      <type name="www">
         <props>
            <otherProps>
               <otherProp name="user">anonymous</otherProp>
               <otherProp name="pass" enabled="true" />
               <otherProp name="url" />
            </otherProps>
            <install name="name001">test</install>
         </props>
      </type>
   </templates>
</root>

Я получаю вывод:

<root>
   <sites>
      <site name="name001" enabled="true"/>
      <env name="name004" enabled="true"/>
   </sites>
   <templates>
      <type name="test999" enabled="true">
         <props>
            <others>
               <other name="name001" enabled="true">WEBSITE1</other>
            </others>
         </props>
      </type>
      <type name="www">
         <props>
            <otherProps>
               <otherProp name="pass" enabled="true"/>
            </otherProps>
         </props>
      </type>
   </templates>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...