使用xslt将xml转换为字符串?

时间:2013-11-06 13:51:15

标签: html xml xslt xslt-1.0 xslt-2.0

如何使用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替换,孩子的孩子应该替换为parent id *的* item parent_id。是否可以使用xslt?

1 个答案:

答案 0 :(得分: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/