从XPath表达式的映射填充(或生成)XML模板文件的最佳方法是什么?
要求是我们需要从模板开始(因为它可能包含XPath表达式中未捕获的信息)。
例如,起始模板可能是:
<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
<ns1:create xmlns:ns1='http://predic8.com/wsdl/material/ArticleService/1/'>
<article xmlns:ns1='http://predic8.com/material/1/'>
<name>?XXX?</name>
<description>?XXX?</description>
<price xmlns:ns1='http://predic8.com/common/1/'>
<amount>?999.99?</amount>
<currency xmlns:ns1='http://predic8.com/common/1/'>???</currency>
</price>
<id xmlns:ns1='http://predic8.com/material/1/'>???</id>
</article>
</ns1:create>
</s11:Body>
</s11:Envelope>
然后提供给我们,类似于:
expression: /create/article[1]/id => 1
expression: /create/article[1]/description => bar
expression: /create/article[1]/name[1] => foo
expression: /create/article[1]/price[1]/amount => 00.00
expression: /create/article[1]/price[1]/currency => USD
expression: /create/article[2]/id => 2
expression: /create/article[2]/description => some name
expression: /create/article[2]/name[1] => some description
expression: /create/article[2]/price[1]/amount => 00.01
expression: /create/article[2]/price[1]/currency => USD
然后,我们应该生成:
<ns1:create xmlns:ns1='http://predic8.com/wsdl/material/ArticleService/1/'>
<article xmlns:ns1='http://predic8.com/material/1/'>
<name xmlns:ns1='http://predic8.com/material/1/'>foo</name>
<description>bar</description>
<price xmlns:ns1='http://predic8.com/common/1/'>
<amount>00.00</amount>
<currency xmlns:ns1='http://predic8.com/common/1/'>USD</currency>
</price>
<id xmlns:ns1='http://predic8.com/material/1/'>1</id>
</article>
<article xmlns:ns1='http://predic8.com/material/2/'>
<name>some name</name>
<description>some description</description>
<price xmlns:ns1='http://predic8.com/common/2/'>
<amount>00.01</amount>
<currency xmlns:ns1='http://predic8.com/common/2/'>USD</currency>
</price>
<id xmlns:ns1='http://predic8.com/material/2/'>2</id>
</article>
</ns1:create>
我是用Java实现的,尽管如果可能的话,我会首选基于XSLT的解决方案。
此转换从“表达式”创建具有所需结果结构的XML文档-仍需将其转换为最终结果:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vPop" as="element()*">
<item path="/create/article[1]/id">1</item>
<item path="/create/article[1]/description">bar</item>
<item path="/create/article[1]/name[1]">foo</item>
<item path="/create/article[1]/price[1]/amount">00.00</item>
<item path="/create/article[1]/price[1]/currency">USD</item>
<item path="/create/article[1]/price[2]/amount">11.11</item>
<item path="/create/article[1]/price[2]/currency">AUD</item>
<item path="/create/article[2]/id">2</item>
<item path="/create/article[2]/description">some name</item>
<item path="/create/article[2]/name[1]">some description</item>
<item path="/create/article[2]/price[1]/amount">00.01</item>
<item path="/create/article[2]/price[1]/currency">USD</item>
</xsl:variable>
<xsl:template match="/">
<xsl:sequence select="my:subTree($vPop/@path/concat(.,'/',string(..)))"/>
</xsl:template>
<xsl:function name="my:subTree" as="node()*">
<xsl:param name="pPaths" as="xs:string*"/>
<xsl:for-each-group select="$pPaths"
group-adjacent=
"substring-before(substring-after(concat(., '/'), '/'), '/')">
<xsl:if test="current-grouping-key()">
<xsl:choose>
<xsl:when test=
"substring-after(current-group()[1], current-grouping-key())">
<xsl:element name=
"{substring-before(concat(current-grouping-key(), '['), '[')}">
<xsl:sequence select=
"my:subTree(for $s in current-group()
return
concat('/',substring-after(substring($s, 2),'/'))
)
"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="current-grouping-key()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:for-each-group>
</xsl:function>
</xsl:stylesheet>
当此转换应用于任何XML文档(未使用)时,结果为:
<create>
<article>
<id>1</id>
<description>bar</description>
<name>foo</name>
<price>
<amount>00.00</amount>
<currency>USD</currency>
</price>
<price>
<amount>11.11</amount>
<currency>AUD</currency>
</price>
</article>
<article>
<id>2</id>
<description>some name</description>
<name>some description</name>
<price>
<amount>00.01</amount>
<currency>USD</currency>
</price>
</article>
</create>
注意事项:
您需要将给出的“表达式”转换为此转换中使用的格式-这是简单而直接的。
在最后的转换中,您需要“按原样”复制每个节点(使用身份规则),除了顶级节点应在"http://predic8.com/wsdl/material/ArticleService/1/”命名空间中生成。请注意,“模板”中存在的其他名称空间不会使用,可以安全地省略。
问题内容: 给定一组XPath映射,我希望能够生成一个完整的XML文件。 输入可以在两个映射中指定:(1)列出XPath表达式和值的映射;(2)另一个定义了适当的名称空间。 对于命名空间: 还要注意,同样重要的是,我还必须处理XPath Attributes 表达式。例如:我也应该能够处理属性,例如: 最终输出应如下所示: PS:这是对先前提出的问题的更详细的问题,尽管由于一系列进一步的要求和说明
主要内容:示例XPath表达式通常定义模式以便选择一组节点。 这些模式由XSLT用于执行转换,或者由用于寻址。 XPath规范指定了七种类型的节点,这些节点可以是XPath表达式的执行输出。 根 元素 文本 属性 注释 处理指令 命名空间 XPath使用路径表达式从XML文档中选择节点或节点列表。 以下是从XML文档中选择节点/节点列表的路径和表达式列表。 序号 表达式 描述 1 选择具有给定名称的所有节点。
英文原文:http://emberjs.com/guides/templates/conditionals/ 有些时候,或许我们只希望在一个属性存在的时候显示一部分模板。 这时,我们就可以使用{{#if}}助手按条件渲染一个代码块,如下所示: 1 2 3 {{#if person}} Welcome back, <b>{{person.firstName}} {{person.lastNam
问题内容: 考虑我有以下示例XML文件: 将其扁平化为一组xpath表达式的最佳(最有效)方法是什么。另请注意:我想忽略任何名称空间和属性信息。(如果需要,也可以将其作为预处理步骤来完成)。 所以我想作为输出: 我正在用Java实现。 编辑: PS,在文本节点上没有数据的情况下,我也可能需要此方法,因此,例如,以下代码应生成与上述相同的输出: 问题答案: 您可以使用XSLT轻松完成此操作。查看示例
问题内容: 我是JAXB的新手,并且想知道是否有一种方法可以使用xpath表达式将XML解组到我的响应对象。问题是我正在呼叫第三方Web服务,收到的响应有很多详细信息。我不希望将XML中的所有详细信息映射到我的响应对象。我只希望从xml映射一些细节,使用这些细节我可以使用特定的XPath表达式并将其映射到我的响应对象。有没有注释可以帮助我实现这一目标? 例如考虑以下响应 我只对检索街道名称感兴趣,
我是JAXB新手,想知道是否有一种方法可以使用xpath表达式将XML解组到响应对象。问题是我正在呼叫第三方Web服务,我收到的回复有很多详细信息。我不希望将XML中的所有细节映射到我的响应对象。我只希望映射xml中的一些细节,使用特定的XPath表达式可以获得这些细节,并将其映射到响应对象。有没有注释可以帮助我实现这一点? 例如,考虑以下响应 我只对检索街道名称感兴趣,所以我想使用xpath表达