代码之家  ›  专栏  ›  技术社区  ›  Starwolf-001

为什么忽略我的XSLTXML输出没有变化

  •  1
  • Starwolf-001  · 技术社区  · 6 年前

    我希望翻译一个XML文件,以便删除副标题“Subheader1”和“Subheader2”,以便我所拥有的程序能够读取XML数据并识别“行/行”下的信息。

    在这种情况下,实现这一点的最佳方法是删除副标题并将所有元素保持在一个标题下。

    我试着去解决我现在的问题但是,我所做的XSLT只是被忽略了到目前为止,我只实现了导出元素数据但是元素头被忽略或者,在本例中,XSLT只导出完全相同的格式我只是不明白为什么会这样。

    XML输入

    <Header xmlns="urn:stuff:xml:ns:neo">
       <ID>1</ID>
       <Department>350</Department>
       <Date>2019-03-07T14:38:00</Date>
       <Order_Number>12345</Order_Number>
       <Comment/>
       <Status>Picking</Status>
       <Subheader1>
          <Subheader2>
             <Product>12510101</Product>
             <Quantity>1</Quantity>
             <Comment_Line/>
             <Location>R11</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="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="Subheader1" />
      <xsl:template match="Subheader2" />
    
    </xsl:stylesheet>
    

    XML输出

    <Header xmlns="urn:stuff:xml:ns:neo">
       <ID>1</ID>
       <Department>350</Department>
       <Date>2019-03-07T14:38:00</Date>
       <Order_Number>12345</Order_Number>
       <Comment/>
       <Status>Picking</Status>
       <Product>12510101</Product>
       <Quantity>1</Quantity>
       <Comment_Line/>
       <Location>R11</Location>
    </Header>
    

    我的电流输出

    
    1
    350
    360
    361
    2019-03-07T14:38:00
    615619
    
    Active
    
    
    1
    12510101
    50153061
    23663
    Active
    
    RM STD
    
    

    我期望上面添加的XML输出任何与此有关的帮助,包括需要做什么和为什么会被感激一段时间以来,我一直在试图解决这个问题,但我不明白为什么会这样。

    1 回复  |  直到 6 年前
        1
  •  2
  •   kjhughes    6 年前

    XSLT可能被“忽略”的一般原因:

    1. 输入XML在一个或多个命名空间中,显式地或默认地, 并且XSLT正在与没有名称空间的元素进行匹配见 下面的XSLT介绍如何与命名空间元素匹配。

    2. 在 输入XML和XSLT。

    3. 所提供的XSLT模板都不匹配,只有 built-in template rules 继续执行转换。

    旁注: 您当前的输出实际上不是发布的XSLT为发布的XML输入文件生成的输出它将根据标识转换将输入XSLT复制到输出XSLT,然后 Line Lines 模板将不起作用,因为没有 生产线 线 输入XML中的元素。

    你的具体案例: 您可以打开 Subheader1 Subheader2 元素通过以下XSLT:

    XSLT

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" 
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:neo="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:Subheader1 | neo:Subheader2">
        <xsl:apply-templates select="node() | @*"/>
      </xsl:template>
    
    </xsl:stylesheet>
    

    XML输出

    <Header xmlns="urn:stuff:xml:ns:neo">
      <ID>1</ID>
      <Department>350</Department>
      <Date>2019-03-07T14:38:00</Date>
      <Order_Number>12345</Order_Number>
      <Comment/>
      <Status>Picking</Status>
    
    
          <Product>12510101</Product>
          <Quantity>1</Quantity>
          <Comment_Line/>
          <Location>R11</Location>
    
    
    </Header>
    

    文本节点

    您可以通过

      <xsl:strip-space elements="neo:Subheader1 neo:Subheader2"/>
    

    添加到 xsl:stylesheet ,或者您可能只想复制 要素 ( * )这两个元素的子元素,而不是所有的子元素 node() 学生:

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

    请注意 | @* 在这里并不需要,但是如果你的实际案例有属性的话,可以帮助你同样,请注意,您可以添加回 processing-instruction()|comment() 如果更改后需要此类子类型 节点() * .