Лучший способ использовать для каждого внутри, если в XSLT - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующие данные XML в качестве входных данных для моего XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<Application>
    <Data>
        <Data1>
            <name>Michale</name>
            <age>65</age>
            <Info>
                <Alias name="M">
                    <Contactmail>abc@gmail.com</Contactmail>
                    <ContactPh>8988900009</ContactPh>
                </Alias>

                <Alias name="Q">
                    <Contactmail>abc@gmail.com</Contactmail>
                    <ContactPh>8988900009</ContactPh>
                </Alias>

            </Info>
        </Data1>
        <Data1>
            <name>Albert</name>
            <age>69</age>
            <Info>
                <Alias name="A">
                    <Contactmail>xyz@gmail.com</Contactmail>
                    <ContactPh>89889908709</ContactPh>
                </Alias>

                <Alias name="P">
                    <Contactmail>pqr@gmail.com</Contactmail>
                    <ContactPh>8988988779</ContactPh>
                </Alias>
            </Info>
        </Data1>
    </Data>
</Application>

И я хочу передать блок Data1, имя псевдонима которого совпадает с «M», т.е.

      <Application>
         <Data>
           <Data1>
              <name>Michale</name>
              <age>65</age>
              <Info>
                <Alias name=M>
                   <Contactmail>abc@gmail.com</Contactmail>
                   <ContactPh>8988900009</ContactPh>
                </Alias> 
                <Alias name=Q>
                   <Contactmail>abc@gmail.com</Contactmail>
                   <ContactPh>8988900009</ContactPh>
                </Alias>  
              </Info>
           </Data1>
       </Data>
     </Application>

Я застрял в том, как получить доступ к циклу (т.е. к псевдониму) внутри условия теста? Есть ли лучший способ сделать это xslt?

<xsl:for-each select="./*[local-name() = 'Application']/*[local-name() = 'Data']">
   <xsl:if test="">
   ....
   </xsl:if>
</xsl:for-each>

Ответы [ 2 ]

0 голосов
/ 31 августа 2018
<xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Application">
        <xsl:copy>
            <xsl:for-each select="Data/Data1">
                <xsl:if test="Info/Alias[@name='M']">
                <Data>
                    <Data1>

                        <xsl:apply-templates/>

                    </Data1>
                </Data>
                </xsl:if>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
You may also do like this
0 голосов
/ 31 августа 2018

Следующий шаблон сделает работу. Объяснения в коде.

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

  <!-- identity template -->                               <!-- Copies all nodes not matched by other templates -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
   </xsl:template>  

  <xsl:template match="Data1[Info/Alias/@name != 'M']" />  <!-- Ignores all Data1 elements which don't have an @name='M' attribute child -->
  <xsl:template match="Data1[Info/Alias/@name = 'M']">     <!-- Matches all Data1 elements which have the desired child attribute -->
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Его вывод:

<?xml version="1.0"?>
<Application>
  <Data>
    <Data1>
      <name>Michale</name>
      <age>65</age>
      <Info>
        <Alias name="M">
          <Contactmail>abc@gmail.com</Contactmail>
          <ContactPh>8988900009</ContactPh>
        </Alias>
        <Alias name="Q">
          <Contactmail>abc@gmail.com</Contactmail>
          <ContactPh>8988900009</ContactPh>
        </Alias>
      </Info>
    </Data1>
  </Data>
</Application>
...