XSL value-of返回无值

时间:2019-07-15 03:58:38

标签: xml xslt xslt-1.0

尝试从原始XML复制元素“ ID”及其值。然后将该“ ID”及其值插入Subheader2下的新XML。

当前已成功为Subheader2的每个子标题在Subheader2下创建了新元素。但是,“ ID”返回空,仅显示关联的名称空间。

还尝试了此操作,其中Header / ID是自己应用的模板。但这仅创建了“ ID”。但是,该“ ID”具有正确的值。

XML输入

<Header xmlns="urn:stuff:xml:ns:neo">
  <Date>2019-03-07T14:38:00</Date>
  <ID>1</ID>
  <Comment/>
  <Subheader1>
    <Subheader2>
      <Item>A11</Item>
      <Quantity>2</Quantity>
      <Location>R12</Location>
    </Subheader2>
    <Subheader2>
      <Item>A12</Item>
      <Quantity>5</Quantity>
      <Location>R10</Location>
    </Subheader2>
  </Subheader1>
</Header>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:neo="xmlns="urn:stuff:xml:ns:neo">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

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

  <xsl:template match="neo:Subheader2">
    <xsl:copy>
      <ID>
        <xsl:value-of select="@neo:Header/neo:ID"/>
      </ID>
      <xsl:copy-of select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XML输出

<Header xmlns="urn:stuff:xml:ns:neo">
  <Date>2019-03-07T14:38:00</Date>
  <ID>1</ID>
  <Comment/>
  <Subheader1>
    <Subheader2>
      <ID>1</ID>
      <Item>A11</Item>
      <Quantity>2</Quantity>
      <Location>R12</Location>
    </Subheader2>
    <Subheader2>
      <ID>1</ID>
      <Item>A12</Item>
      <Quantity>5</Quantity>
      <Location>R10</Location>
    </Subheader2>
  </Subheader1>
</Header>

所需的XML输出

<Subheader1>
  <Subheader2>
    <ID>1</ID>
    <Item>A11</Item>
    <Quantity>2</Quantity>
    <Location>R12</Location>
  </Subheader2>
  <Subheader2>
    <ID>1</ID>
    <Item>A12</Item>
    <Quantity>5</Quantity>
    <Location>R10</Location>
  </Subheader2>
</Subheader1>

当前XML输出

<Header xmlns="urn:stuff:xml:ns:neo">
  <Date>2019-03-07T14:38:00</Date>
  <ID>1</ID>
  <Comment/>
  <Subheader1>
    <Subheader2>
      <ID xmlns="" xmlns:neo="urn:stuff:xml:ns:neo"/>
      <Item>A11</Item>
      <Quantity>2</Quantity>
      <Location>R12</Location>
    </Subheader2>
    <Subheader2>
      <ID xmlns="" xmlns:neo="urn:stuff:xml:ns:neo"/>
      <Item>A12</Item>
      <Quantity>5</Quantity>
      <Location>R10</Location>
    </Subheader2>
  </Subheader1>
</Header>

基本上,我只是将'ID'元素复制到'Subheader2'之后。真的,我只希望每个Subheader2的Subheader1 / Subheader2中的数据都可以,但是只需将“ ID”添加到每个“ Subheader2”中就可以了。

2 个答案:

答案 0 :(得分:0)

使用xsl:for-each仅定位Subheader2数据。

发现您创建了XML变量。在for-each外部创建一个变量,然后将其用作Subheader2的xsl扩展范围内的值。

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:stuff:xml:ns:neo">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
  <xsl:variable name="variable" select="neo:Header/neo:ID"/>
    <xsl:for-each select="neo:Header/neo:Subheader1/neo:Subheader2">
      <Subheader2>
        <ID><xsl:value-of select="$variable"/></ID>
        <Item><xsl:value-of select="neo:Item"/></Item>
        <Quantity><xsl:value-of select="neo:Quantity"/></Quantity>
        <Location><xsl:value-of select="neo:Location"/></Location>
      </Subheader2>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

这将创建以下XML

<Subheader2 xmlns:neo="urn:stuff:xml:ns:neo">
    <ID>1</ID>
    <Item>A11</Item>
    <Quantity>2</Quantity>
    <Location>R12</Location>
</Subheader2>
<Subheader2>
    <ID>1</ID>
    <Item>A12</Item>
    <Quantity>5</Quantity>
    <Location>R10</Location>
</Subheader2>

答案 1 :(得分:0)

根据迈克尔·凯(Michael Kay)在另一个答案中的评论,您也可以这样做。...

<xsl:value-of select="/neo:Header/neo:ID"/>

(因此,您只有一个字符。@代表一个属性,/代表顶级文档节点)。

您还需要添加一个模板,以忽略其当前位置的neo:ID

<xsl:template match="neo:ID" />

但是您还有另一个问题。在模板中执行<ID>...</ID>会在没有名称空间的情况下创建一个ID元素,这就是为什么在输出中获得xmlns=""的原因。您需要做的是在XSLT中声明一个默认名称空间,以便在该名称空间中创建ID元素。

xmlns="urn:stuff:xml:ns:neo" 

尝试使用此XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:neo="urn:stuff:xml:ns:neo" 
                xmlns="urn:stuff:xml:ns:neo" 
                exclude-result-prefixes="neo">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:strip-space elements="*" />

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

  <xsl:template match="neo:ID" />

  <xsl:template match="neo:Subheader2">
    <xsl:copy>
      <ID>
        <xsl:value-of select="/neo:Header/neo:ID"/>
      </ID>
      <xsl:copy-of select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

请注意,如果您不想在输出中使用neo:Header元素(或除SubHeader2之外的子节点,则将与此匹配的模板neo:ID替换为:

<xsl:template match="/*">
  <xsl:apply-templates select="neo:Subheader1/neo:Subheader2" />
</xsl:template>