У меня есть XML, содержащий узлы, записывающие FilePath
и FileName
. Мне нужно XSLT
, чтобы преобразовать их в отдельные узлы для FilePathAndName
. Значения FilePath
могут заканчиваться или не заканчиваться '\' . Любое из значений может быть пустым. Значения FilePathAndName
должны заканчиваться на '\' , если это просто имя папки.
Преобразование будет вызываться из приложения C #, поэтому я думаю, что, возможно, я смогу использовать любую версию XSLT.
Я получил неполный путь, но изо всех сил пытаюсь сделать полное решение, включая учет необязательных '\' значений во входных данных.
Вот пример ввода XML:
<Task>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePath" ParameterValue="folder1\sub-folder1" /> <!-- FilePath doesn't end in '\' -->
<Parameter ParameterName="FileName" ParameterValue="file1" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePath" ParameterValue="folder2\sub-folder2\" /> <!-- FilePath ends in '\' -->
<Parameter ParameterName="FileName" ParameterValue="file2" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePath" ParameterValue="" /> <!-- Empty FilePath -->
<Parameter ParameterName="FileName" ParameterValue="file3" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePath" ParameterValue="folder4\sub-folder4" /> <!-- Empty FileName -->
<Parameter ParameterName="FileName" ParameterValue="" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePath" ParameterValue="" /> <!-- Empty FilePath and FileName -->
<Parameter ParameterName="FileName" ParameterValue="" />
</Action>
<Action ActionName="GetRateData">
<!-- No FilePath Node -->
<Parameter ParameterName="FileName" ParameterValue="file5" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePath" ParameterValue="folder6\sub-folder6" />
<!-- No FileName Node -->
</Action>
<Action ActionName="GetRateData">
<!-- No FilePath or FileName Node -->
</Action>
</Task>
, которое следует преобразовать в следующее:
<Task>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="folder1\sub-folder1\file1" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="folder2\sub-folder2\file2" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="file3" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="folder4\sub-folder4\" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="file5" />
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="folder6\sub-folder6\"/>
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="" />
</Action>
</Task>
Это моя попытка решения:
<xsl:template match="Task">
<Task>
<xsl:for-each select="Action">
<Action>
<xsl:copy-of select="@ActionName"/>
<xsl:for-each select="Parameter">
<Parameter>
<xsl:choose>
<xsl:when test="@ParameterName = 'FilePath'">
<xsl:attribute name="ParameterName">
<xsl:text>FilePathAndName</xsl:text>
</xsl:attribute>
<xsl:attribute name="ParameterValue">
<xsl:value-of select="@ParameterValue" />\<xsl:value-of select="(../Parameter[@ParameterName='FileName'])[1]/@ParameterValue" /></xsl:attribute>
<!-- TODO: Don't include '\' if FilePath is empty. -->
<!-- TODO: What if FilePath is missing? -->
</xsl:when>
<xsl:when test="@ParameterName = 'FileName'">
<!-- FileName will be consumed above. -->
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="@ParameterName"/>
<xsl:copy-of select="@ParameterValue"/>
</xsl:otherwise>
</xsl:choose>
</Parameter>
</xsl:for-each>
</Action>
</xsl:for-each>
</Task>
</xsl:template>
</xsl:stylesheet>
, который выдает следующее (см. Оставшиеся проблемы в XML-комментариях ниже):
<Task
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName"
ParameterValue="folder1\sub-folder1\file1"/> <!-- Correct -->
<Parameter/>
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName"
ParameterValue="folder2\sub-folder2\\file2"/> <!-- Wrong: Should not have \\ -->
<Parameter/>
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="\file3"/> <!-- Wrong: FilePathAndName should not start with \ -->
<Parameter/>
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="folder4\sub-folder4\"/> <!-- Correct -->
<Parameter/>
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="\"/> <!-- Wrong: FilePathAndName should not start with \ -->
<Parameter/>
</Action>
<Action ActionName="GetRateData"> <!-- Wrong: FilePathAndName is missing -->
<Parameter/>
</Action>
<Action ActionName="GetRateData">
<Parameter ParameterName="FilePathAndName" ParameterValue="folder6\sub-folder6\"/> <!-- Correct -->
</Action>
<Action ActionName="GetRateData"/> <!-- Correct -->
</Task>