使用XSLT使用名称空间转换xml

时间:2016-11-03 12:19:52

标签: xslt

我有以下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>

1 个答案:

答案 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>...