XSLT: как исключить узел из XML на основе значения атрибута? - PullRequest
0 голосов
/ 05 мая 2020

Введите ниже XML, сначала мне нужно исключить узлы с пустым узлом сведений об образовании. И я мог добиться этого, выполнив <xsl:template match="parent/child[education = '']"/>. Теперь из возвращенных результатов мне нужно удалить узел namedetails, если значение test1 в нем не совпадает с child/name/lastname. Я должен применить это только к XML данным, полученным при удалении пустого узла образования. Когда я пытаюсь использовать <xsl:template match="parent/namedetails[test1 = parent/child/name[@lastname]]"/>, он не фильтрует, как я ожидал. Вместо этого включает весь узел namedetails. Пожалуйста, предложите.

Ввод XML:

<?xml version="1.0" encoding="UTF-8"?>
<parent>
    <namedetails>
        <test1>xyz</test1>
        <test2>match1</test2>
    </namedetails>
    <child>
        <age>30</age>
        <name>
            <firstname>abc</firstname>
            <lastname>xyz</lastname>
            <middlename>v</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>No</masters>
        </education>
        <dob>25-MAR-1990</dob>
        <location>city123</location>        
    </child>
    <namedetails>
        <test1>123</test1>
        <test2>match2</test2>
    </namedetails>    
    <child>
        <age>29</age>
        <name>
            <firstname>def</firstname>
            <lastname>123</lastname>
            <middlename>a</middlename>
        </name>
        <education/>
        <dob>25-MAR-1991</dob>
        <location>city123</location>        
    </child>
    <namedetails>
        <test1>345w</test1>
        <test2>match3</test2>
    </namedetails>     
    <child>
        <age>35</age>
        <name>
            <firstname>ghi</firstname>
            <lastname>345</lastname>
            <middlename>r</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>Yes</masters>
        </education>
        <dob>25-MAR-1985</dob>
        <location>city123</location>        
    </child>
</parent>

Желаемый выход XML:

<?xml version="1.0" encoding="UTF-8"?>
<parent>
    <namedetails>
        <test1>xyz</test1>
        <test2>match1</test2>
    </namedetails>
    <child>
        <age>30</age>
        <name>
            <firstname>abc</firstname>
            <lastname>xyz</lastname>
            <middlename>v</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>No</masters>
        </education>
        <dob>25-MAR-1990</dob>
        <location>city123</location>        
    </child>

    <namedetails>
        <test1>345w</test1>
        <test2>match3</test2>
    </namedetails>     
    <child>
        <age>35</age>
        <name>
            <firstname>ghi</firstname>
            <lastname>345</lastname>
            <middlename>r</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>Yes</masters>
        </education>
        <dob>25-MAR-1985</dob>
        <location>city123</location>        
    </child>
</parent>

Используемый XSLT:

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

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

<xsl:template match="parent/child[education = '']"/>
<xsl:template match="parent/namedetails[test1 = parent/child/name[@lastname]]"/>
</xsl:stylesheet>

Полученный Результат:

<parent>
      <namedetails>
            <test1>xyz</test1>
            <test2>match1</test2>
      </namedetails>
      <child>
            <age>30</age>
            <name>
                  <firstname>abc</firstname>
                  <lastname>xyz</lastname>
                  <middlename>v</middlename>
            </name>
            <education>
                  <graduate>Yes</graduate>
                  <masters>No</masters>
            </education>
            <dob>25-MAR-1990</dob>
            <location>city123</location>        
      </child>
      <namedetails>
            <test1>123</test1>
            <test2>match2</test2>
      </namedetails>    

      <namedetails>
            <test1>345w</test1>
            <test2>match3</test2>
      </namedetails>     
      <child>
            <age>35</age>
            <name>
                  <firstname>ghi</firstname>
                  <lastname>345</lastname>
                  <middlename>r</middlename>
            </name>
            <education>
                  <graduate>Yes</graduate>
                  <masters>Yes</masters>
            </education>
            <dob>25-MAR-1985</dob>
            <location>city123</location>        
      </child>
</parent>

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

вот точный код для вашего требования.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>     
<xsl:template match="@* | node()">
  <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match= "parent/namedetails[following-sibling::[1][education = ''] and 
                      test1=following-sibling::[1]/name/lastname]"/>
<xsl:template match="parent/child[education = '']"/>

</xsl:stylesheet>
0 голосов
/ 07 мая 2020

@ Veena - я не знаю, что именно вам требовалось на выходе. Но я думаю, вы получите такой же результат, как и я, попробуйте этот способ.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:output indent="yes"/>

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

<xsl:template match="parent">
    <parent>
        <xsl:for-each select="namedetails">
            <xsl:if test="./test1=following-sibling::child[1]/name/lastname">
                <xsl:apply-templates select="."/>
            </xsl:if>
            <xsl:apply-templates select="following-sibling::child[1]"/>
        </xsl:for-each>
    </parent>
</xsl:template>

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