Я преобразовываю XML, в котором я должен найти определенный элемент (на основе значения атрибута) и обновить элемент и его дочерние атрибуты.
Пример файла XML приведен ниже.
<?xml version="1.0" encoding="utf-8"?>
<Configuration>
<Environments>
<Environment id="Master"/>
<Environment id="Developer"/>
</Environments>
<Common>
<Logging>
<LogFile>log\updater.log</LogFile>
</Logging>
</Common>
<Configuration>
Мой XSLT-файл показан ниже.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:param name="EnvironmentId" />
<xsl:param name="SelectEnvironment" />
<!-- Copy All Elements -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Modify Element with id = Developer-->
<xsl:template match="Environment/@id[. ='Developer']">
<xsl:attribute name="id">
<xsl:value-of select="$EnvironmentId"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
В этом XSLT переменная EnvironmentId содержит новый идентификатор; переменная SelectEnvironment должна содержать значение Developer (или любое другое предоставленное пользователем значение, передаваемое через C # .NET)
Вопрос
Как мне написать свой XSLT, чтобы совпадение работало на основе пользовательского значения?
Я попробовал следующее
<xsl:template match="Environment/@id[. ='$SelectEnvironment']">
<xsl:attribute name="id">
<xsl:value-of select="$EnvironmentId"/>
</xsl:attribute>
</xsl:template>
Нет ошибок. Но идентификатор attr не был обновлен.
Я пробовал это ...
<xsl:template match="Environment/@id[. =$SelectEnvironment]">
<xsl:attribute name="id">
<xsl:value-of select="$EnvironmentId"/>
</xsl:attribute>
</xsl:template>
И я получил ошибку времени выполнения Переменные не могут быть использованы в этом выражении.