1

如何使用 XSLT 将 format1 中的 xml 转换为 format2 中提到的字符串?

格式 1

 <children>
    <child data="test1">
    <content><name>test1</name>
     <child>
      <content><name>test1child</name>
     </child>
    </child>
    </children>

格式 2

"<root>"
+"<item id='test1'>"
+"<content><name>test1</name></content>"
+"<item parent_id='test1'>"             
+"<content><name>test1child</name>"
+"</content>"      
+"</item>"
+</item>
+"<root>"

所以孩子应该用root替换,孩子应该用item替换,孩子的孩子应该用*item parent_id of parent id*替换。可以用xslt吗?

4

1 回答 1

2

假设 XSLT 2.0,这里有一些关于如何处理的建议,假设您真的想要一些带有引号和加号的字符串输出(获取 Javascript 或类似代码来将 XML 构造为字符串?):

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

<xsl:output method="text"/>

<xsl:template match="*">
  <xsl:param name="name" select="name()"/>
  <xsl:text>&lt;</xsl:text>
  <xsl:value-of select="$name"/>
  <xsl:apply-templates select="@*"/>
  <xsl:text>&gt;</xsl:text>
  <xsl:apply-templates/>
  <xsl:text>&lt;/</xsl:text>
  <xsl:value-of select="$name"/>
  <xsl:text>&gt;</xsl:text>
</xsl:template>

<xsl:template match="@*">
  <xsl:param name="name" select="name()"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="$name"/>
  <xsl:text>='</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>'</xsl:text>
</xsl:template>

<xsl:template match="text()[matches(., '^\s+$')]">
  <xsl:text>"
+"</xsl:text>
</xsl:template>

<xsl:template match="/children">
  <xsl:text>"</xsl:text>
  <xsl:next-match>
    <xsl:with-param name="name" select="'root'"/>
  </xsl:next-match>
  <xsl:text>"</xsl:text>
</xsl:template>

<xsl:template match="child">
  <xsl:next-match>
    <xsl:with-param name="name" select="'item'"/>
  </xsl:next-match>
</xsl:template>

<xsl:template match="child//child">
  <xsl:variable name="copy" as="element()">
    <xsl:copy>
      <xsl:attribute name="parent_id" select="ancestor::child[1]/@data"/>
      <xsl:copy-of select="@* , node()"/>
    </xsl:copy>
  </xsl:variable>
  <xsl:apply-templates select="$copy"/>
</xsl:template>

</xsl:stylesheet>

这改变了输入

<children>
    <child data="test1">
     <content><name>test1</name></content>
     <child>
      <content><name>test1child</name></content>
     </child>
    </child>
</children>

进入结果

"<root>"
+"<item data='test1'>"
+"<content><name>test1</name></content>"
+"<item parent_id='test1'>"
+"<content><name>test1child</name></content>"
+"</item>"
+"</item>"
+"</root>"

到目前为止,该代码有许多缺点,因为它不会构造具有正确转义属性值的格式良好的 XML,并且也不关心输出名称空间声明。但是,您可以采用更复杂的解决方案,例如http://lenzconsulting.com/xml-to-string/

于 2013-11-06T21:44:15.147 回答