#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>
Краткие сведения
Некоторые из ваших шаблонов соответствуют неправильным дочерним элементам. Результат может отличаться от вашего реального ожидаемого результата.