2

我有一个输入xml如下

<maindocument>
<first>
<testing>random text</testing>
<checking>random test</checking>
</first>
<testing>
<testing>sample</testing>
<checking>welcome</checking>
<import>
<downloading>valuable text</downloading>
</import>
</testing>
</maindocument>

这里的输出我想要像下面一样的输出

<maindocument>
<import>
<doctype>Valuable</doctype>
<docint>text</docint>
</import>
</maindocument

我正在xslt中尝试上面的代码在绝对路径和相对路径的帮助下,我的问题是我将如何进入测试元素,然后我必须从那里选择导入元素。

请指导我

问候卡西克

4

2 回答 2

2

将正确的元素复制到输出很容易,并且使用 XSLT 2.0 也很容易分解元素的内容downloading

<xsl:output indent="yes"/>

<xsl:template match="maindocument">
  <xsl:copy>
    <xsl:apply-templates select="testing/import"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="import">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="import/downloading">
  <xsl:analyze-string select="." regex="(\w)(\w+)\s+(\w+)">
    <xsl:matching-substring>
      <doctype>
        <xsl:value-of select="concat(upper-case(regex-group(1)), regex-group(2))"/>
      </doctype>
      <docint>
        <xsl:value-of select="regex-group(3)"/>
      </docint>
    </xsl:matching-substring>
  </xsl:analyze-string>
</xsl:template>

</xsl:stylesheet>

使用 Saxon 9.4 上述样式表转换输入

<maindocument>
<first>
<testing>random text</testing>
<checking>random test</checking>
</first>
<testing>
<testing>sample</testing>
<checking>welcome</checking>
<import>
<downloading>valuable text</downloading>
</import>
</testing>
</maindocument>

进入

<maindocument>
   <import>
      <doctype>Valuable</doctype>
      <docint>text</docint>
   </import>
</maindocument>

的使用analyze-string是一个例子,从你的样本中我不清楚downloading元素可以有什么样的输入以及你想如何处理它。因此,如果以上内容还不够,请发布更多详细信息。

于 2012-08-01T12:04:19.740 回答
1
With the help of absolute path and relative path my question is how i will get into testing element then i have to select import element from there.

实际上,没有必要指定一个完整的路径testing并检查它是否有一个import孩子。

XSLT 处理模型(内置模板)与您的模板和适当的模板匹配模式相结合,为您进行导航。

如果没有与特定节点匹配的显式模板,则选择执行内置模板。应用内置模板的累积结果是遍历文档树,只输出文本节点。

可以指定模板以仅针对应该以不同的特定方式处理的节点覆盖内置模板。当内置模板为节点的子节点应用模板并且存在与该节点匹配的显式(用户提供的)模板时,选择该显式模板用于该节点的执行/处理。

这个简短的 XSLT 1.0 转换

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

 <xsl:template match="/">
     <maindocument>
        <xsl:apply-templates/>
     </maindocument>
 </xsl:template>

 <xsl:template match="import/downloading">
  <import>
    <doctype><xsl:value-of select="substring-before(., ' ')"/></doctype>
    <docint><xsl:value-of select="substring-after(., ' ')"/></docint>
  </import>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当应用于提供的 XMLdocument 时

<maindocument>
    <first>
        <testing>random text</testing>
        <checking>random test</checking>
    </first>
    <testing>
        <testing>sample</testing>
        <checking>welcome</checking>
        <import>
            <downloading>valuable text</downloading>
        </import>
    </testing>
</maindocument>

产生想要的正确结果

<maindocument>
   <import>
      <doctype>valuable</doctype>
      <docint>text</docint>
   </import>
</maindocument>
于 2012-08-01T12:09:09.663 回答