Я пытаюсь заменить Local [002], [Local003], [Local004] и [Local005] на Local [001] в C #, используя XSLT.
Если вы хотите использовать XSLT, вот полное преобразование XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"XPath/text()
[contains(translate(.,'23456789','00000000'),
'/Local[000]'
)
]">
<xsl:value-of select=
"concat(substring-before(., '['),
'[001]',
substring-after(., ']')
)
"/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к предоставленному документу XML :
<Adresses>
<Address1>
<XPath>//Address/Local[001]/AddressLine1</XPath>
<Key>1</Key>
</Address1>
<Address2>
<XPath>//Address/Local[002]/AddressLineA</XPath>
<Key>2</Key>
</Address2>
<Address3>
<XPath>//Address/Local[003]/AddressLineBC</XPath>
<Key>3</Key>
</Address3>
<Address4>
<XPath>//Address/Local[004]/AddressLineA1</XPath>
<Key>4</Key>
</Address4>
<Address5>
<XPath>//Address/Local[005]/AddressLineCD1</XPath>
<Key>5</Key>
</Address5>
</Adresses>
желаемый, правильный результат получен :
<Adresses>
<Address1>
<XPath>//Address/Local[001]/AddressLine1</XPath>
<Key>1</Key>
</Address1>
<Address2>
<XPath>//Address/Local[001]/AddressLineA</XPath>
<Key>2</Key>
</Address2>
<Address3>
<XPath>//Address/Local[001]/AddressLineBC</XPath>
<Key>3</Key>
</Address3>
<Address4>
<XPath>//Address/Local[001]/AddressLineA1</XPath>
<Key>4</Key>
</Address4>
<Address5>
<XPath>//Address/Local[001]/AddressLineCD1</XPath>
<Key>5</Key>
</Address5>
</Adresses>
Как запустить преобразование XSLT в .NET описано в соответствующей документации MSDN (XslCompiledTransform.Transform()
)
Объяснение : Переопределение правила идентификации .Использование стандартных функций XPath contains()
, translate()
и concat()
.