这是我第一次处理xslt创作时,发现它真的很棘手。
我已经请求XML并使用xslt它应该使用下面提到的o / p生成XML。
执行此操作的实用程序已在C#中构建。我需要编写XSLT来正确读取XML中的值并创建具有预期格式的新XML。
我正在尝试编写XSLT来转换XML(i / p):
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing"
xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Body>
<ExecuteESI xmlns="http://TTTT.com/Enterprise/ServiceGateways/">
<context xmlns:b="http://TTTT.com/Enterprise/ServiceGateways/Core/Contracts/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<request xmlns:b="http://TTTT.com/Enterprise/ServiceGateways/ExternalService/Request/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<b:Message>
<ns2:ReqProv xmlns:ns2="http://TTTT.com/TTTT/TTTTestJSONESIRequest/">
<ns2:CID>TTTT</ns2:CID>
<ns2:TIME>18732081720160855</ns2:TIME>
<ns2:HASH>40dad29c4ae9303c975639f7700bf517e6e72fbf5723c7905a74fde0d5452da0</ns2:HASH>
</ns2:ReqProv>
</b:Message>
</request>
</context>
</ExecuteESI>
</s:Body>
</s:Envelope>
以下提到的格式(o / p):
<?xml version="1.0" encoding="UTF-8"?>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">CID=TTTT&TIME=18732081720160855&HASH=40dad29c4ae9303c975639f7700bf517e6e72fbf5723c7905a74fde0d545</string>
我写过以下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"
xmlns:ns="http://asurion.com/TTTT/TTTTTestJSONESIRequest/"
xmlns="http://schemas.microsoft.com/2003/10/Serialization/"
exclude-result-prefixes="msxsl xsl ns">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:variable name="CID">
<xsl:value-of select="./ns:ReqProv/ns:CID"/>
</xsl:variable>
<xsl:variable name="TIME">
<xsl:value-of select="./ns:ReqProv/ns:TIME"/>
</xsl:variable>
<xsl:variable name="HASH">
<xsl:value-of select="./ns:ReqProv/ns:HASH"/>
</xsl:variable>
CID=<xsl:value-of select="$CID" />&TIME=<xsl:value-of select="$TIME" />&HASH=<xsl:value-of select="$HASH" />
</xsl:template>
</xsl:stylesheet>
我尝试了<xsl:value-of...
和<xsl:template match...
以及<xsl:template name....
的不同组合,但似乎没有效果。
答案 0 :(得分:2)
您的尝试存在许多问题 - 最严重的问题是使用错误的命名空间。请尝试改为:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://TTTT.com/TTTT/TTTTestJSONESIRequest/"
xmlns="http://schemas.microsoft.com/2003/10/Serialization/"
exclude-result-prefixes="ns">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<string>
<xsl:text>CID=</xsl:text>
<xsl:value-of select="//ns:ReqProv/ns:CID"/>
<xsl:text>@amp;TIME=</xsl:text>
<xsl:value-of select="//ns:ReqProv/ns:TIME"/>
<xsl:text>@amp;HASH=</xsl:text>
<xsl:value-of select="//ns:ReqProv/ns:HASH"/>
</string>
</xsl:template>
</xsl:stylesheet>
注意强>:
为你只需要一次的事情定义一个变量是没有意义的;
输出文字文本时使用xsl:text
指令要方便得多;它还使代码更易于阅读和维护。
答案 1 :(得分:1)
试试这个:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ns="http://asurion.com/TTTT/TTTTTestJSONESIRequest/"
xmlns="http://schemas.microsoft.com/2003/10/Serialization/"
xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns2="http://TTTT.com/TTTT/TTTTestJSONESIRequest/"
exclude-result-prefixes="msxsl xsl ns">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:variable name="CID">
<xsl:value-of select="//ns2:ReqProv/ns2:CID"/>
</xsl:variable>
<xsl:variable name="TIME">
<xsl:value-of select="//ns2:ReqProv/ns2:TIME"/>
</xsl:variable>
<xsl:variable name="HASH">
<xsl:value-of select="//ns2:ReqProv/ns2:HASH"/>
</xsl:variable>
<xsl:element name="string">CID=<xsl:value-of select="$CID" />&TIME=<xsl:value-of select="$TIME" />&HASH=<xsl:value-of select="$HASH" /></xsl:element>
</xsl:template>
</xsl:stylesheet>
需要改变
<xsl:value-of select="./ns:ReqProv/ns:CID"/>
到
<xsl:value-of select="//ns2:ReqProv/ns2:CID"/>
因为,在put xml中,ns2是元素CID的命名空间。
<强>输出:强>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">CID=TTTT&TIME=18732081720160855&HASH=40dad29c4ae9303c975639f7700bf517e6e72fbf5723c7905a74fde0d5452da0</string>
答案 2 :(得分:1)
你快到了。您需要在样式表模板中提供<string>
结果元素,修复XPath表达式,并修复不匹配的名称空间URI。
您需要将与"/"
匹配的模板更改为以下内容:
<xsl:template match="/">
<!-- No need to use value-of here.
Also use .// instead of ./, because ns:ReqProv is not a child of /. -->
<xsl:variable name="CID" select=".//ns:ReqProv/ns:CID"/>
<xsl:variable name="TIME" select=".//ns:ReqProv/ns:TIME"/>
<xsl:variable name="HASH" select=".//ns:ReqProv/ns:HASH"/>
<string>CID=<xsl:value-of select="$CID" />&TIME=<xsl:value-of select="$TIME" />&HASH=<xsl:value-of select="$HASH" /></string>
</xsl:template>
您还需要在输入XML和XSLT中更改这两个名称空间URI中的一个以使它们匹配:
"http://TTTT.com/TTTT/TTTTestJSONESIRequest/"
和
"http://asurion.com/TTTT/TTTTTestJSONESIRequest/"
我猜这些在你的实际输入XML和XSLT中实际上是相同的,但你在这里发布问题时改变了其中一个。因此,您需要确保它们匹配。