从xpath字符串创建XML

时间:2013-04-02 16:58:23

标签: xml xslt xpath

我正在对XML文件进行Schematron验证,结果如下:

<fired-rule context="Message[@Name='SPY_IN']"/>
<failed-assert test="@OppositeMacAddress='0x00'" location="/Module[1]/Router[1]/Message[1]">
  <text>!Error! Erwarteter Wert:"0x00"</text>
</failed-assert>

<fired-rule context="Configuration[@Address='W_ST_PLAMA_MOD_OWM_OPP']"/>
<failed-assert test="@Name='8'"
  location="/Module[1]/DriverConfigurations[1]/DriverConfiguration[20]/Configuration[10]">
  <text>!Error! Erwarteter Wert:"8"</text>
</failed-assert>

现在我正在尝试生成一个引用“location”属性的XML文件。 它应该是这样的:

<Module>
  <Router>
    <Message>
    </Message>
  </Router>
</Module>
<Module>
  <DriverConfigurations>
    <DriverConfiguration>
      <Configuration>
      </Configuration>
    </DriverConfiguration>
  </DriverConfigurations>
</Module>

我试着参考这个:auto creating xml elements using XSLT 但它在某种程度上对我不起作用。所以我不知道我的xsl文件应该是什么样的。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

尝试一下:

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

  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="//failed-assert/@location" />
    </root>
  </xsl:template>

  <xsl:template match="@location">
    <xsl:param name="path" select="." />

    <xsl:variable name="currentContext" 
                  select="substring-before(substring-after($path,'/'), '[')"/>
    <xsl:variable name="subContext" select="substring-after($path, ']')"/>
    <xsl:element name="{$currentContext}">
      <xsl:apply-templates select="current()[string($subContext)]">
        <xsl:with-param name="path" select="$subContext"/>
      </xsl:apply-templates>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

在此输入上运行时:

<root>
  <fired-rule context="Message[@Name='SPY_IN']"/>
  <failed-assert test="@OppositeMacAddress='0x00'" location="/Module[1]/Router[1]/Message[1]">
    <text>!Error! Erwarteter Wert:"0x00"</text>
  </failed-assert>

  <fired-rule context="Configuration[@Address='W_ST_PLAMA_MOD_OWM_OPP']"/>
  <failed-assert test="@Name='8'"
    location="/Module[1]/DriverConfigurations[1]/DriverConfiguration[20]/Configuration[10]">
    <text>!Error! Erwarteter Wert:"8"</text>
  </failed-assert>
</root>

结果是:

<root>
  <Module>
    <Router>
      <Message />
    </Router>
  </Module>
  <Module>
    <DriverConfigurations>
      <DriverConfiguration>
        <Configuration />
      </DriverConfiguration>
    </DriverConfigurations>
  </Module>
</root>