问题:我想读取web.config文件中的一个值,并基于该值,将其他两个节点中存在特定属性的节点转换为新属性值。
要读取的值:ClientName,可以是ABCD或WXYZ。如果是WXYZ,则更改....要更改的值:requireSSL从true(如果客户端名称为ABCD)或false(如果为WXYZ)。
此值将位于不是ClientName节点的子节点的不同节点中。
这是我想做的:
- 旧的Web配置:**
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ClientName" value="ABCD" />
</appSettings>
<system.web>
<httpCookies requireSSL="true" />
<authentication mode="Forms">
<forms cookieless="UseCookies" enableCrossAppRedirects="true" defaultUrl="~/Account/Login.aspx" loginUrl="~/Account/Login.aspx" protection="All" timeout="15" requireSSL="true" />
</authentication>
</system.web>
</configuration>
- 新Web配置:**
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ClientName" value="WXYZ" />
</appSettings>
<system.web>
<httpCookies requireSSL="false" />
<authentication mode="Forms">
<forms cookieless="UseCookies" enableCrossAppRedirects="true" defaultUrl="~/Account/Login.aspx" loginUrl="~/Account/Login.aspx" protection="All" timeout="15" requireSSL="false" />
</authentication>
</system.web>
</configuration>
- 我想读取"ClientName"的值,如果它是"WXYZ",那么我想将"requireSSL"设置为"false"。但是,如果它是任何其他值("ABCD"或其他任何值),那么我想将它设置为"true"。
我不想更改"客户端名称"的值。它将在这个过程之外设置。但是,如果它是"WXYZ",那么我希望"requireSSL"为"false",否则为"true"。
为了避免混淆,我声明我在这里只使用"ABCD"作为ClientName值,在我的现实世界中,它们是不同的,并且思想是当转换检测到ClientName是这个特定的值时,转换发生,否则,它不发生。
对于我们的大多数站点,我们希望requireSSL = true,但我们有几个特定的站点需要它为false。我希望这是有意义的。无论如何,鉴于旧的Web配置如上所述,想法是基于ClientName,我需要的值为true或false。
- 此转换有效,但不读取任何"ClientName"值:**
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="ClientName" value="ABCD" />
</appSettings>
<system.web>
<httpCookies requireSSL="false" xdt:Transform="SetAttributes" xdt:Locator="Condition(@requireSSL='true')" />
<authentication mode="Forms">
<forms cookieless="UseCookies"
enableCrossAppRedirects="true"
defaultUrl="~/Account/Login.aspx"
loginUrl="~/Account/Login.aspx" protection="All"
timeout="15" requireSSL="false"
xdt:Transform="SetAttributes" xdt:Location="Condition(@requireSSL='true')" />
</authentication>
</system.web>
</configuration>
因此,这或多或少是我的出发点,但我不知道从这里去哪里。学习微软网站在页面的最后有一部分显示了一个可能的解决方案,但我只是没有摸索它。
我使用this site来测试我的转换。
到目前为止,我已经尝试过了:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Locator="Condition(@ClientName='ABCD')">
<appSettings>
<add key="ClientName" value="ABCD" />
</appSettings>
<system.web>
<httpCookies requireSSL="false" xdt:Transform="SetAttributes(requireSSL)" />
<authentication mode="Forms">
<forms cookieless="UseCookies"
enableCrossAppRedirects="true"
defaultUrl="~/Account/Login.aspx"
loginUrl="~/Account/Login.aspx" protection="All"
timeout="15" requireSSL="false"
xdt:Transform="SetAttributes(requireSSL)" />
</authentication>
</system.web>
</configuration>
这一点:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Locator="Condition(@ClientName='ABCD')">
<appSettings>
<add key="ClientName" value="ABCD" />
</appSettings>
<system.web>
<httpCookies requireSSL="false" xdt:Transform="SetAttributes" />
<authentication mode="Forms">
<forms cookieless="UseCookies"
enableCrossAppRedirects="true"
defaultUrl="~/Account/Login.aspx"
loginUrl="~/Account/Login.aspx" protection="All"
timeout="15" requireSSL="false"
xdt:Transform="SetAttributes" />
</authentication>
</system.web>
</configuration>
这一点:
还有这个
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Locator="XPath(configuration/appSettings/add[@key='ClientName' and @value='INEI'])">
<appSettings>
<add key="ClientName" value="INEI" />
</appSettings>
<system.web>
<httpCookies requireSSL="false" xdt:Transform="SetAttributes(requireSSL)" />
<authentication mode="Forms">
<forms cookieless="UseCookies"
enableCrossAppRedirects="true"
defaultUrl="~/Account/Login.aspx"
loginUrl="~/Account/Login.aspx" protection="All"
timeout="15" requireSSL="false"
xdt:Transform="SetAttributes(requireSSL)" />
</authentication>
</system.web>
</configuration>
所有这些都不会在在线测试应用程序中产生错误,但我得到的值始终为"true"。我还做了许多其他的变化,但它们都在requireSSL值处留下了"true"。
我希望有人确切地知道如何解决这个问题,并能提供解决方案,或者有人知道这是如何工作的,并能告诉我,这根本不可能做到。
1条答案
按热度按时间qojgxg4l1#
请通过XSLT 1.0尝试以下解决方案
它使用的是所谓的"身份转换"模式。