Функции XPath name()
и local-name()
могут использоваться для чтения имени неизвестного элемента.Затем они сравниваются со значениями элементов в предикате.Я предполагаю, что строка </MLinkParameterDefinition>
в вашем примере кода была ошибкой ввода, а вместо нее подразумевалось </ParameterDefinition>
.В этом решении и <ParameterSection>
, и <Parameter>
должны иметь значение, соответствующее элементу, оно также проверяет, что значение id-элементов должно быть не пустым.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="*/ParameterVisualization/ParameterDefinition"/>
</xsl:template>
<xsl:template match="ParameterDefinition">
<xsl:variable name="nodeId" select="/*/*[local-name() = current()/ParameterSection]
/*[local-name() = current()/Parameter]
[normalize-space()]"/>
<xsl:choose>
<xsl:when test="$nodeId">
<xsl:value-of select="$nodeId"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>N/A</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="following-sibling::ParameterDefinition">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Вывод с вашим (исправлено) пример ввода
1,2,N/A
Нет пробела между запятыми и запятой после последнего значения.
Почему-то я чувствую, что ключи должны использоваться в подобных проблемах сопоставления, но для меня это казалосьболее простой способ решения проблемы.