我是XSL Transformations的新手。我从其他问题中尝试了本网站的所有可能选项。答案,但我认为我的情况很少独特(至少对我而言)。
我必须解析xml以下并构造一个键值对有点结构作为输出。
我的实际xml如下所示。
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance/" xmlns:HNS="http://tempuri.org/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://tempuri.org/">
<SOAP-ENV:Header>
<ROClientIDHeader SOAP-ENV:mustUnderstand="0" xmlns="http://tempuri.org/">
<ID>{E931E54B-DA4C-4A93-9BF3-BF82EE028B26}</ID>
</ROClientIDHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body xmlns:ro="http://tempuri.org/">
<v1:Response>
<v1:Result>
<v1:Fields>
<v1:TSimpleDataField>
<v1:FieldName>COMMENT</v1:FieldName>
</v1:TSimpleDataField>
<v1:TSimpleDataField>
<v1:FieldName>SITE_TYPE</v1:FieldName>
</v1:TSimpleDataField>
<v1:TSimpleDataField>
<v1:FieldName>TOTAL_ADDRESSES</v1:FieldName>
</v1:TSimpleDataField>
</v1:Fields>
<v1:Data>
<v1:TVarArray>
<v1:anyType>DQT NLB Dev</v1:anyType>
<v1:anyType>62</v1:anyType>
<v1:anyType>100</v1:anyType>
</v1:TVarArray>
</v1:Data>
</v1:Result>
</v1:Response>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我想解析并提取<v1:Fields>
和<v1:Data>
下的值并构建一条记录。
例如,如果我们从这两个元素中获取单个键对值,如下所示 的
<v1:TSimpleDataField>
<v1:FieldName>COMMENT</v1:FieldName>
</v1:TSimpleDataField>
<v1:TVarArray>
<v1:anyType>DQT NLB Dev</v1:anyType>
我希望看到输出如下
<v1:Response>
<v1:COMMENT>DQT NLB Dev</v1:COMMENT>
<v1:SITE_TYPE>62</SITE_TYPE>
<v1:TOTAL_ADDRESSES>100</v1:TOTAL_ADDRESSES>
</v1:Response>
编写XSLT以从此给定的xml中提取此数据的最佳方法是什么。任何帮助或指示都会非常感激。
答案 0 :(得分:1)
以下是您可以根据自己的需求调整的示例:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:v1="http://tempuri.org/"
exclude-result-prefixes="SOAP-ENV">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<v1:root>
<xsl:for-each select="SOAP-ENV:Envelope/SOAP-ENV:Body/v1:Response/v1:Result/v1:Fields/v1:TSimpleDataField">
<xsl:variable name="i" select="position()" />
<xsl:element name="v1:{v1:FieldName}">
<xsl:value-of select="../../v1:Data/v1:TVarArray/v1:anyType[$i]" />
</xsl:element>
</xsl:for-each>
</v1:root>
</xsl:template>
</xsl:stylesheet>
应用于您的(更正的)示例输入,结果为:
<?xml version="1.0" encoding="UTF-8"?>
<v1:root xmlns:v1="http://tempuri.org/">
<v1:COMMENT>DQT NLB Dev</v1:COMMENT>
<v1:SITE_TYPE>62</v1:SITE_TYPE>
<v1:TOTAL_ADDRESSES>100</v1:TOTAL_ADDRESSES>
</v1:root>
我在这里重复一下我在评论中发出的警告:如果任何一个<v1:FieldName>
元素包含一个不能用作有效XML元素名称的值,则会失败。