XSL 1.0 проверяет строку переменной с текущим значением

#xml #xslt

#xml #xslt

Вопрос:

Я хочу проверить текущее значение с помощью переменной значений (массива). Каким-то образом мне нужен еще один цикл в тесте if.

Моя цель — сопоставить языки из sourceXml с testLanguages.xml

sourceXML

 <?xml version="1.0" encoding="utf-8"?>
<a>
 <b lang="en"></b>
 <b lang="de"></b>
 <b lang="it"></b>
 <b lang="jp"></b>
</a>
  

testLanguages.xml

 <?xml version="1.0" encoding="utf-8"?>
<languages>
<lang Key="de" Id="1031" />
<lang Key="en" Id="1033" />
</languages>
  

Мой текущий XSL, который не работает:

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

  <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
  <xsl:strip-space elements="*" />

  <xsl:variable name="language" select="document('testLanguages.xml')/lang" />

  <xsl:template match="/">

  <xsl:template match="a">

  <xsl:for-each select="./b">
    <xsl:if test=".b[@lang=$language@Key]">
        Only DE and EN should be here
    </xsl:if>
  </xsl:for-each>

  </xsl:template>

</xsl:stylesheet>
  

Ответ №1:

Решение XSLT 1.0 [без какого <xsl:key> -либо использования]

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

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
    <xsl:strip-space elements="*" />

    <xsl:variable name="language" select="document('testLanguages.xml')//lang" />

    <xsl:template match="a">
        <xsl:copy>
            <xsl:for-each select="b[@lang = $language/@Key]">
                <xsl:copy>
                    <xsl:copy-of select="@* | $language[@Key = current()/@lang]/@*"/>
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
  

Вывод

 <?xml version="1.0" encoding="UTF-8"?>
<a>
   <b lang="en" Key="en" Id="1033"/>
   <b lang="de" Key="de" Id="1031"/>
</a>
  

Краткие сведения

Некоторые из ваших шаблонов соответствуют неправильным дочерним элементам. Результат может отличаться от вашего реального ожидаемого результата.