我有以下xml
<?xml version="1.0" encoding="UTF-8"?>
<typeNames xmlns="http://www.dsttechnologies.com/awd/rest/v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<typeName recordType="case" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLECASE">SAMPLECASE</typeName>
<typeName recordType="folder" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLEFLD">SAMPLEFLD</typeName>
<typeName recordType="source" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLEST">SAMPLEST</typeName>
<typeName recordType="transaction" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLEWT">SAMPLEWT</typeName>
</typeNames>
我想使用XSLT转换为xml以上:
<response>
<results>
<source>
SAMPLEST
</source>
</results>
</response>
</xsl:template>
我只想从输入xml获取源到输出xml。
我正在尝试使用以下xml,但无法获得所需的输出xml:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:v="http://www.dsttechnologies.com/awd/rest/v1" version="2.0" exclude-result-prefixes="v">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="typeNames">
<response>
<results>
<source>
<xsl:value-of select="source" />
</source>
</results>
</response>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
<强>予。输入xml中的命名空间
<typeNames xmlns="http://www.dsttechnologies.com/awd/rest/v1"...
xmlns
将self +所有子节点放入命名空间。此命名空间不需要任何前缀。
<强> II。 XSLT中的命名空间
... xmlns:v="http://www.dsttechnologies.com/awd/rest/v1"...
您使用v
作为名称空间(与源相同)的前缀,因此您必须在xpath中编写此前缀。
<xsl:template match="v:typeNames">
[XSLT 2.0:您还可以在样式表部分添加xpath-default-namespace="uri"
,以便为所有xpath表达式定义默认命名空间。因此,您不必为命名空间添加前缀。]
<强> III。猜测给定输入xml
<xsl:value-of select="source" /> -> <typeName recordType="source"..>SAMPLEST</typeName>
如果要选择显示的xml节点,则必须编写以下内容之一:
absolute, without any context node:
/v:typeNames/v:typeName[@recordType = 'source']
on context-node typeNames:
v:typeName[@recordType = 'source']
[<xsl:value-of select="..."/>
将返回文本节点,例如“SAMPLEST”]
编辑:
如果有两个标签怎么办。
首先要做的事情:XSLT 1中的<xsl:value-of
只能用于1个节点!如果xpath表达式匹配多个节点,它将只处理第一个节点!
像这样解决:
...
<results>
<xsl:apply-templates select="v:typeName[@recordType = 'source']"/>
</results>
...
<xsl:template match="v:typeName[@recordType = 'source']">
<source>
<xsl:value-of select="."/>
</source>
</xsl:template>
apply-templates
中的results
搜索所有typeName..source
。匹配模板侦听该节点并创建xml <source>...
。