如何在 XSLT 中访问具有动态节点名称的节点的子节点

齐伯乔克

我坚持这个问题。

我有这个 XML:

<Document>
  <Type>ABC</Type>
  <Header>
    <Date>15-01-2017</Date>
    <Time>11:00 AM</Time>
  </Header>
  <Body>
    <Name>Juan</Name>
    <Age>10</Age>
    <Address>
      <City>City</City>
      <Country>Country</Country>
      <Block>Block</Block>
    </Address>
  </Body>
</Document>

我有这个 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" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name ="DocumentType" select ="//Document/Type" />

  <xsl:template match ="Document">
    <Root>
      <xsl:apply-templates select ="Header" />
      <xsl:element name="Data{$DocumentType}">
        <xsl:call-template name="Data">
          <xsl:with-param name="type" select ="$DocumentType" />
        </xsl:call-template>
      </xsl:element>
    </Root>
  </xsl:template>

  <xsl:template name ="Data">
    <xsl:param name="type" />
    <Name>
      <xsl:value-of select ="Body/Name" />
    </Name>
    <Age>
      <xsl:value-of select ="Body/Age" />
    </Age>
    <xsl:element name="Address{$type}">
      <City>
        <xsl:value-of select ="City"/>
      </City>
      <Country>
        <xsl:value-of select ="Country"/>
      </Country>
      <Block>
        <xsl:value-of select ="Block"/>
      </Block>
    </xsl:element>
  </xsl:template>

  <xsl:template match ="Header">
    <Header>
      <DateCreated>
        <xsl:value-of select ="Date"/>
      </DateCreated>
      <TimeCreated>
        <xsl:value-of select ="Time"/>
      </TimeCreated>
    </Header>
  </xsl:template>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

我的问题是我无法访问 XML 中地址的子节点的值,我只看到了这个:

<Root>
  <Header>
    <DateCreated>15-01-2017</DateCreated>
    <TimeCreated>11:00 AM</TimeCreated>
  </Header>
  <DataABC>
    <Name>Juan</Name>
    <Age>10</Age>
    <AddressABC>
      <City></City>
      <Country></Country>
      <Block></Block>
    </AddressABC>
  </DataABC>
</Root>

谁能帮我告诉我我的错误。

谢谢

michael.hor257k

您的错误已在迈克尔凯的回答中指出。

我想建议一种替代方法 - 一种需要更少工作的方法:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="DocumentType" select="/Document/Type" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/Document">
    <Root>
        <xsl:apply-templates select="Header | Body"/>
    </Root>
</xsl:template>

<xsl:template match="Body">
    <xsl:element name="Data{$DocumentType}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="Date | Time">
    <xsl:element name="{name()}Created">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="Address">
    <xsl:element name="Address{$DocumentType}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

请注意,全局变量可以从任何模板访问,不需要作为参数发送。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

xslt如何获得相同节点名称也是子节点的情况下的父节点位置

当变量等于节点名称时,XSLT如何获取值?

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对其进行排序

如何在neo4j中创建具有相同节点名称的两个节点之间的关系

XSLT如何更改节点名称的一部分?

如何使用XSLT更改标签位置,但不提及节点名称

当您仅知道节点名称的一部分时,XSLT如何处理节点?

如何替换 XML 的子节点名称

如何匹配xml中xslt中的子节点?

如何从XSLT 1.0中的当前节点祖先访问先前同级的子级

XSLT:如何遍历具有多个相同子节点的唯一节点并仅选择一个特定子节点

如何在 XSLT 中循环并生成匹配节点的计数?

如何使用子节点的 xslt 从 xml 获取以下兄弟节点

如何使用XSLT根据子节点的条件复制父节点?

如何从 XmlDocument 中读取带有节点名称的所有节点值

如何在jenkinsfile中获取代理/节点名称?

如何遍历节点并跳过具有相同值的重复节点-XSLT 1,0

XSLT如何避免选择节点

如何在Firebase Android中检索节点名称和节点属性

当多个节点具有相同名称时,如何在XML中编辑特定节点的值?

如何返回用 XSLT 中另一个子节点的数据修改的子节点?

如何从发送到 Cloudwatch 的指标中删除子节点名称?

如何使用XSLT转换添加子节点的XML?

Firebase 如何添加具有给定名称的子节点?

xslt合并具有相同名称的多个节点

XSLT选择具有名称空间的节点

XSLT:递归合并具有相同名称的节点

使用 XSLT 以 XML 格式打印两个标记之间的所有节点名称

如何从Jenkins管道脚本中的标签获取节点名称