面对编写xslt for XML的困难

时间:2016-08-18 12:58:30

标签: xml xslt xsd

这是我第一次处理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&amp;TIME=18732081720160855&amp;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" />&amp;TIME=<xsl:value-of select="$TIME" />&amp;HASH=<xsl:value-of select="$HASH" />

  </xsl:template>

</xsl:stylesheet>

我尝试了<xsl:value-of...<xsl:template match...以及<xsl:template name....的不同组合,但似乎没有效果。

3 个答案:

答案 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" />&amp;TIME=<xsl:value-of select="$TIME" />&amp;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&amp;TIME=18732081720160855&amp;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" />&amp;TIME=<xsl:value-of select="$TIME" />&amp;HASH=<xsl:value-of select="$HASH" /></string>

  </xsl:template>

您还需要在输入XML和XSLT中更改这两个名称空间URI中的一个以使它们匹配:

"http://TTTT.com/TTTT/TTTTestJSONESIRequest/"

"http://asurion.com/TTTT/TTTTTestJSONESIRequest/"

我猜这些在你的实际输入XML和XSLT中实际上是相同的,但你在这里发布问题时改变了其中一个。因此,您需要确保它们匹配。