문제

나는 Martin Fowler 's를 구현하려고합니다 2 단계보기 패턴웹 애플리케이션에서 HTML을 렌더링하기 위해 작성합니다. 일반적인 아이디어는 애플리케이션이 원시 HTML을 출력하는 대신 사용자 정의 중개 XML을 출력 한 다음 HTML/CSS로 변환된다는 것입니다. 여기에는 코드 복제 감소 및보다 일관된 출력을 포함하여 여러 가지 장점이 있습니다.

Fowler가 XML을 최종 HTML로 변환하기 위해 제안한 접근법은 XSLT를 사용하는 것입니다.

나는 전에 XSLT를 사용했고 기본 사항을 알고 있습니다. 그러나 XSLT를 사용하면 어떤 장점이 있는지 궁금합니다. 내가 고려하고있는 대체 접근법은 다음과 같이 보입니다.

다음은 첫 번째 렌더링 단계의 XML 출력 예입니다.

<grid>
   <headingRow>
      <cell>Product</cell>
      <cell>Price</cell>
   </headingRow>
   <row>
      <cell>A product</cell>
      <cell type="price">$54.95</cell>
   </row>
</grid>

그리고 원하는 최종 HTML 출력 :

<table class="grid">
  <tr>
    <th>Product</th>
    <th>Price</th>
  </tr>
  <tr>
    <td>A product</td>
    <td>
      <span class="currency_symbol">$</span>
      <span class="decimal_number">54.95</span>
    </td>
  </tr>
</table>

내가 고려하는 접근 방식은 각 태그에 대해 하나의 객체를 가질 것입니다.

class GridTag extends Tag {
  ...
  public void render() {
    System.out.println("<table class=\"grid\">");
    foreach(Tag child: children) {
      child.render();
    }
    System.out.println("</table>");
  }
  ...
}

물체는 XML을 구문 분석하여 나무로 구성됩니다. Render () 메소드는 루트 노드에서 호출됩니다. 나는이 접근법이 시원한 일을 할 수 있기 때문에 특히이 접근법을 좋아합니다. 특히 속성 유형 = "price"와 함께 위와 같이 셀 태그가있는 경우 :

<cell type="price">$54.95</price>

관련 태그 클래스는 위의 HTML 출력에서와 같이 통화 기호와 숫자 값을 별도의 HTML 태그로 분리하기 위해 태그의 내용을 구문 분석 할 수 있습니다.

<td>
  <span class="currency_symbol">$</span>
  <span class="decimal_number">54.95</span>
</td>

질문:

이 작업을 수행해야합니까, 아니면 XSLT를 사용해야합니까? 내가 놓칠 수있는 XSLT를 사용하면 어떤 장점이 있습니까? XSLT를 사용해야한다면 가격표의 내용을 구문 분석하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

나는 왜 당신이 왜 당신이 하나 또는 다른 사람과 함께 가야하는지에 대해 많이 말할 수 없습니다.

렌더링 프로세스의 기술적 세부 사항, 서버에서 또는 브라우저에서 발생할 수 있는지, 각각 XSLT를 사용하는지 또는 XSLT의 대안에 각각 얼마나 편한지에 달려 있다고 생각합니다.

한 지점 ~을 위한 XSLT는 잘 형성되지 않은 XML 출력을 생성하는 것이 사실상 불가능하다는 것입니다 (나는 말하지 않습니다. 유효한). 문자열을 쓸 때 무언가를 놓치기 쉽습니다.

구문 분석 문제와 관련하여 : 의심 할 여지없이 가장 좋은 방법은 XML에서 데이터와 형식을 바로 분리하는 것입니다. XSLT는 구문 분석을위한 것이 아니므로 XML이 처음 부터이 형식으로 될 수없는 이유가 없습니다.

<cell type="price" symbol="$">54.95</cell>

그러나 당신이 그것에 대해 아무것도 할 수 없다고 가정하면,이 xslt는 그것을 처리합니다.

<xsl:template match="cell[@type='price']">
  <td>
    <xsl:variable name="vNonNumbers" select="translate(., '0123456789.', '')" />
    <xsl:variable name="vTheNumbers" select="translate(., $vNonNumbers, '')" />
    <span class="currency_symbol">
      <xsl:value-of select="$vNonNumbers" />
    </span>
    <span class="decimal_number">
      <xsl:value-of select="$vTheNumbers" />
    </span>
  </td>
</xsl:template>

위의 이유가 본질적으로 나쁜 코드인지 알 수 있기를 바랍니다. 대안과 비교하십시오 (XML 인 경우 ~일 것이다 별도의 데이터 및 형식) :

<xsl:template match="cell[@type='price']">
  <td>
    <span class="currency_symbol">
      <xsl:value-of select="@symbol" />
    </span>
    <span class="decimal_number">
      <xsl:value-of select="." />
    </span>
  </td>
</xsl:template>

다른 팁

제안하는 코드에는 몇 가지 문제가 있습니다. 가장 큰 것은 표준 출력으로 출력을 하드 코딩하여 추가 후 처리를 수행하기가 더 어렵다는 것입니다. 출력 스트림이나 작가를 수락하기 위해 렌더 메소드를 수정하여 변경하기가 어렵지 않습니다.

그럼에도 불구하고, 당신이 제안하고있는 것은 기본적으로 매우 구체적인 XSLT 변환을 구현하는 수많은 Java 코드입니다. XSLT를 배우고 사용하여 XML을 HTML로 변환하는 것이 훨씬 좋습니다. 장점은 XSLT가 이러한 종류의 변형을 위해 설계된 범용 도구라는 것입니다.

다음은 XSLT의 예입니다. 불행히도 나는 도망 쳤다 신경 쓰다 통화 값을 숫자와 상징적 인 부분으로 구문 분석해야했던 시간에 대해 바로 이는 확실히 시작하기에 충분합니다.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/grid">
    <table class="grid">
      <xsl:apply-templates select="headingRow"/>
      <xsl:apply-templates select="row"/>
    </table>
  </xsl:template>
  <xsl:template match="headingRow">
      <tr>
        <xsl:apply-templates select="cell" mode="heading"/>
      </tr>
  </xsl:template>
  <xsl:template match="row">
      <tr>
        <xsl:apply-templates select="cell" mode="normal"/>
      </tr>
  </xsl:template>  
  <xsl:template match="cell" mode="heading">
    <th><xsl:value-of select="."/></th>
  </xsl:template>

  <xsl:template match="cell" mode="normal">
    <xsl:choose>
      <xsl:when test="@type='price'">
        <td>
          <span class="currency_symbol">
            <xsl:value-of select="." />
          </span>
          <span class="decimal_number">
            <xsl:value-of select="." />
          </span>
        </td>
      </xsl:when>
      <xsl:otherwise>
        <td>
          <xsl:value-of select="." />
        </td>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top